Unable to find a javac compiler

97,092

Solution 1

All your ant stuff will work fine except the javac task which needs the tools.jar, located in the /lib directory from the JDK, JRE is not sufficient in that case. Therefore the hint from ant : "Unable to find a javac compiler;..."

When working with Eclipse the default setting points to your JRE installation.
So, one of your first steps after starting Eclipse for the first time should be :
Window > Preferences > Java > Installed JREs and change the settings from JRE to JDK.
Alternatively use :
Window > Preferences > Ant > Runtime > Classpath > Global Entries
and add the tools.jar from your JDK/lib folder

Solution 2

I had the same problem. In my case, I fixed it by pointing JAVA_HOME to the JDK folder, rather than the JDK\bin folder.

Solution 3

Currently you have set JAVA_HOME to your installed jre instead of the jdk. Install the current JDK then set JAVA_HOME to your JDK Directory.

You'll find the current jdk here http://www.oracle.com/technetwork/java/javase/downloads/index.html

Solution 4

I had this problem and commented on https://stackoverflow.com/a/8406221/866333 saying the fix was no good. (Actually it was reporting that JAVA_HOME was something else so I suggested a script was changing it).

As their reply stated the compiler doesn't lie.

So true, I eventually spotted my old JAVA_HOME variable was something like JDK_v7.0.7 when I'd just removed that (from a 2012 restore DVD) and updated to like JDK_v7.7.1. Why it saw fit to fallback to the JRE, suppose it was a convenience.

eg

JAVA_HOME = c:\Java\JDK_v7.0.7

@runs script...@

Perhaps JAVA_HOME does not point to the JDK. It is currently set to "C:\Program Files\Java\jre7"

@check at cmd prompt@

set
JAVA_HOME = c:\Java\JDK_v7.0.7

so it is kinda lieing isn't it?

Solution 5

I made the mistake of installing the JDK and the JRE to the same location. Installing the JDK automatically installs a JRE and I inadvertently selected the same location as the JDK.

This caused considerable confusion in eclipse.

Install the JDK and the JRE to different locations.

Share:
97,092

Related videos on Youtube

Sarin Jacob Sunny
Author by

Sarin Jacob Sunny

Updated on July 09, 2022

Comments

  • Sarin Jacob Sunny
    Sarin Jacob Sunny almost 2 years

    I am trying to package my web application into war file using Ant.

    When I build, I am getting the following error:

    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"
    

    The following is my 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>
    

    How can I compile a class file that does not have a main class?

    How do I set the class path?

    For reference, I am using Eclipse.

  • Rebse
    Rebse over 9 years
    The comp isn't lying ;) How do you start your ant script ?=
  • John
    John over 9 years
    No, I forgot where I commented I was so flustered. I actually had the wrong JDK version in my path variable since the "clean install" required me remove outdated Java. Bit of a typo hunt but I wholly approve your answer now.

Related