web-dev-qa-db-fra.com

Impossible de trouver un compilateur javac

J'essaie de conditionner mon application Web dans un fichier war à l'aide de Ant.

Quand je construis, j'obtiens l'erreur suivante:

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"

Ce qui suit est mon 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>

Comment puis-je compiler un fichier de classe qui n'a pas de classe principale?

Comment définir le chemin de classe?

Pour référence, j'utilise Eclipse.

39
Sarin Jacob Sunny

Tous vos éléments ant fonctionneront correctement, à l'exception de la tâche javac qui nécessite le fichier tools.jar, située dans le répertoire/lib du JDK. JRE n'est pas suffisant dans ce cas. Par conséquent, le conseil de ant: "Impossible de trouver un compilateur javac; ..."

Lorsque vous utilisez Eclipse, le paramètre par défaut indique votre installation JRE.
Ainsi, l’un de vos premiers pas après le démarrage d’Eclipse devrait être:
Window > Preferences > Java > Installed JREs et modifiez les paramètres de JRE à JDK.
Alternativement utiliser:
Window > Preferences > Ant > Runtime > Classpath > Global Entries 
et ajoutez le fichier tools.jar à partir de votre dossier JDK/lib

68
Rebse

J'ai eu le même problème. Dans mon cas, je l'ai corrigé en faisant pointer Java_HOME vers le dossier JDK, plutôt que vers le dossier JDK\bin.

11

Actuellement, vous avez défini Java_HOME sur votre jre installé à la place de jdk . Installez le JDK actuel, puis définissez Java_HOME sur votre répertoire JDK.

Vous trouverez le jdk actuel ici http://www.Oracle.com/technetwork/Java/javase/downloads/index.html

8
sandrozbinden

J'ai eu ce problème et commenté https://stackoverflow.com/a/8406221/866333 en disant que le correctif n'était pas bon. (En réalité, il était signalé que Java_HOME était quelque chose d'autre, alors j'ai suggéré qu'un script le modifiait).

Comme leur réponse le déclarait, le compilateur ne ment pas.

Tellement vrai, j'ai finalement repéré que ma vieille variable Java_HOME ressemblait à JDK_v7.0.7 alors que je l'avais retirée (d'un DVD de restauration 2012) et mise à jour pour ressembler à JDK_v7.7.1. Pourquoi at-il jugé bon de s’en remettre à la JRE, supposons que ce soit une commodité?.

par exemple

Java_HOME = c:\Java\JDK_v7.0.7

@runs script ... @

Peut-être que Java_HOME ne pointe pas vers le JDK. Il est actuellement réglé sur "C:\Program Files\Java\jre7"

@check at cmd Invite @

ensemble
Java_HOME = c:\Java\JDK_v7.0.7

donc c'est un peu mentir n'est-ce pas?

5
John

J'ai commis l'erreur d'installer le JDK et le JRE au même endroit. L'installation du JDK installe automatiquement un JRE et j'ai sélectionné par inadvertance le même emplacement que le JDK.

Cela a provoqué une confusion considérable dans Eclipse. 

Installez le JDK et le JRE dans différent emplacements.

3
rainecc

Ceci est une erreur commune de la plupart des débutants,

JRE est juste pour exécuter du code/des applications Java.

Si vous souhaitez compiler du code Java, vous devez utiliser JDK.

Ouvrez donc les variables d’environnement et définissez le chemin Java_HOME sur le dossier JDK au lieu de JRE  screen shot of env variables

1
Basil

J'obtenais cette erreur en essayant d'installer un outil basé sur Java, en utilisant ant.

Ma variable d'environnement $ Java_HOME, dans ~/.bash_profile, a été définie sur /usr/lib/jvm/Java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/jre

En supprimant jre, (augmentant d'un niveau de répertoire), on obtient $ Java_HOME, /Usr/lib/jvm/Java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64 /,fixed le problème pour moi.

N'oubliez pas de courir, source ~/.bash_profile, après avoir effectué le changement! HTH

0
ashish makani