Невозможно найти компилятор javac - PullRequest
40 голосов
/ 06 декабря 2011

Я пытаюсь упаковать свое веб-приложение в файл war, используя Ant.

При сборке я получаю следующую ошибку:

C:\Documents and Settings\Administrator\workspace\Assignment7\build.xml:67: Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK.
It is currently set to "C:\Program Files\Java\jre6"

Вот мой build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="Generate War" default="install" basedir=".">


    <property name="build.dir" value="build"/>
    <property name="dir.name" value="Assignment7"/>
    <property name="package.name" value="${dir.name}.war"/>

    <property name="content" value="webContent"/>
    <property name="web-inf" value="${content}\WEB-INF"/>
    <property name="meta-inf" value="${content}\META-INF"/>
    <property name="jsp.dir.name" value="${content}"/>

    <property name="lib" value="${web-inf}\lib"/>
    <property name="src" value="src"/>
    <property name="dest.dir" value="target"/>

    <!-- Setting path to the server webapp folder -->

    <property name="webapp.dir" value="C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps"/>

    <!--  Using temp folder for convinence -->

    <property name="temp.dir" value="temp"/>
    <property name="temp.dir.web-inf" value="${temp.dir}\WEB-INF"/>
    <property name="temp.dir.meta-inf" value="${temp.dir}\META-INF"/>
    <property name="temp.dir.lib" value="${temp.dir.web-inf}\lib"/>
    <property name="temp.dir.classes" value="${temp.dir.web-inf}\classes"/>
    <!--<property name="temp.dir.classes.dir" value="${temp.dir.classes}\**"/>-->

    <property name="package.file" value="${dest.dir}\${package.name}"/>

    <path id="build.class.path">
        <fileset dir="${lib}">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <path id="build.class.path1">
        <fileset dir="C:\program files\java\jre6\lib">
            <include name="**/*.jar"/>
        </fileset>

    </path>

    <target name="clean">
        <delete>
            <fileset dir="${dest.dir}" includes="**/*"/>
        </delete>
        <delete dir="${temp.dir}"/>
        <delete dir="${temp.dir.classes}"/>
        <delete dir="${temp.dir.web-inf}"/>
        <delete dir="${temp.dir.meta-inf}"/>
    </target>


    <target name="prepare" depends="clean">
        <mkdir dir="${dest.dir}"/>
        <mkdir dir="${temp.dir}"/>
        <mkdir dir="${temp.dir.web-inf}"/>
        <mkdir dir="${temp.dir.lib}"/>
        <mkdir dir="${temp.dir.classes}"/>
        <mkdir dir="${temp.dir.meta-inf}"/>
    </target>

    <target name="compile" depends="prepare">
        <echo>==="complie"===</echo>
        <javac srcdir="${src}" destdir="${temp.dir.classes}" debug="on">
            <classpath refid="build.class.path"></classpath> 
        </javac>
        <!--<copydir src="${build.dir}\classes" dest="${temp.dir.classes}"/>-->
    </target>

    <target name="package" depends="compile">
        <echo>"PACKAGING THE FILES"</echo>
            <copy file="${meta-inf}\MANIFEST.MF" tofile="${temp.dir.meta-inf}\MANIFEST.MF" overwrite="true"/>
            <copy file="${web-inf}\web.xml" tofile="${temp.dir.web-inf}\web.xml" overwrite="true"/>
            <copy file="${web-inf}\tiles.xml" tofile="${temp.dir.web-inf}\tiles.xml" overwrite="true"/>
            <copy todir="${temp.dir.classes}">
                <fileset dir="${src}">
                    <include  name="**/*.xml"/>
                </fileset>
            </copy>

            <war destfile="${package.file}" webxml="${temp.dir.web-inf}\web.xml" basedir="${temp.dir}">
                <fileset dir="${jsp.dir.name}"/>
                <lib dir="${lib}"></lib>
                <classes dir="${temp.dir.classes}"></classes>
            </war>
    </target>

    <target name="jsps">
            <copy todir="${webapp.dir}\${dir.name}">
                <fileset dir="${content}">
                    <include name="**/*.jsp"/>
                    <include name="**/*.html"/>
                    <include name="**/*.css"/>
                    <include name="**/*.gif"/>
                    <include name="**/*.jpg"/>
                    <include name="**/*.png"/>
                    <include name="**/*.js"/>
                </fileset>
            </copy>
    </target>

    <target name="install" depends="package">
            <copy file="${package.file}" todir="${webapp.dir}" overwrite="true"/>
    </target>

</project>

Как мне скомпилировать файл класса, у которого нет основного класса?

Как установить путь к классу?

Для справки, я использую Eclipse.

Ответы [ 7 ]

68 голосов
/ 07 декабря 2011

Все ваши муравьиные вещи будут работать нормально, за исключением задачи javac, для которой нужен файл tools.jar, расположенный в каталоге / lib из JDK, JRE в этом случае недостаточно. Поэтому подсказка от ant: «Невозможно найти компилятор javac; ...»

При работе с Eclipse настройки по умолчанию указывают на вашу установку JRE.
Итак, один из ваших первых шагов после первого запуска Eclipse должен быть:
Window > Preferences > Java > Installed JREs и измените настройки с JRE на JDK.
Альтернативное использование:
Window > Preferences > Ant > Runtime > Classpath > Global Entries
и добавьте tools.jar из папки JDK / lib

11 голосов
/ 01 января 2014

У меня была такая же проблема.В моем случае я исправил это, указав JAVA_HOME в папку JDK, а не в папку JDK \ bin.

9 голосов
/ 06 декабря 2011

В настоящее время вы установили JAVA_HOME на свой установленный jre вместо jdk. Установите текущий JDK, затем установите JAVA_HOME в свой каталог JDK.

Вы найдете текущий JDK здесь http://www.oracle.com/technetwork/java/javase/downloads/index.html

5 голосов
/ 19 января 2015

У меня была эта проблема, и я прокомментировал https://stackoverflow.com/a/8406221/866333, сказав, что исправление не принесло пользы. (На самом деле он сообщал, что JAVA_HOME - это что-то еще, поэтому я предположил, что сценарий его меняет).

Как говорится в их ответе, компилятор не лжет.

Итак, в конце концов я заметил, что моя старая переменная JAVA_HOME была чем-то вроде JDK_v7.0.7, когда я только что удалил ее (с DVD-диска восстановления 2012 года) и обновил до JDK_v7.7.1. Почему он счел нужным отступить на JRE, предположим, что это было удобно.

1010 * например *

JAVA_HOME = c: \ Java \ JDK_v7.0.7

@ запускает скрипт ... @

Возможно, JAVA_HOME не указывает на JDK. В настоящее время установлено значение "C: \ Program Files \ Java \ jre7"

@ проверьте в командной строке @

набор
JAVA_HOME = c: \ Java \ JDK_v7.0.7

так что это своего рода ложь, не так ли?

3 голосов
/ 22 марта 2013

Я сделал ошибку, установив JDK и JRE в одно и то же место.Установка JDK автоматически устанавливает JRE, и я случайно выбрал то же место, что и JDK.

Это вызвало значительную путаницу в затмении.

Установите JDK и JRE в различных местах.

1 голос
/ 10 апреля 2017

Это распространенная ошибка большинства новичков,

JRE только для запуска кода / приложений на основе Java.

Если вы хотите скомпилировать код Java, вы должны использовать JDK.

Итак, откройте переменные окружения и установите путь JAVA_HOME для папки JDK вместо JRE screen shot of env variables

0 голосов
/ 06 сентября 2017

Я получал эту ошибку при попытке установить инструмент на основе Java, используя ant.

Моя переменная среды $ JAVA_HOME в ~ / .bash_profile была установлена ​​в /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/jre

Удалив jre, (поднявшись на один уровень вверх по каталогу), сделав $ JAVA_HOME, /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/, исправил проблему для меня.

Не забудьте запустить исходный код ~ / .bash_profile после внесения изменений! НТН

...