无法找到javac编译器

43

我正在尝试使用Ant将我的Web应用程序打包为war文件。

当我构建时,我遇到了以下错误:

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个回答

69

所有与ant相关的内容都可以正常运行,除了javac任务需要使用位于JDK / lib目录中的tools.jar,这种情况下JRE不足以支持。因此,ant提示信息为:"无法找到javac编译器;..."

在使用Eclipse时,默认设置会指向您的JRE安装。
因此,第一次启动Eclipse后的首要步骤之一应该是:
窗口>首选项>Java>已安装的JRE并将设置从JRE更改为JDK。
还可以使用:
窗口>首选项>Ant>运行时>类路径>全局条目
并添加来自JDK / lib文件夹的tools.jar。


计算机没有说谎 ;) 你如何启动你的ant脚本? - Rebse
不好意思,我忘记了我在哪里评论过,当时我很慌乱。实际上,我的路径变量中有错误的JDK版本,因为“clean install”需要我删除过时的Java。虽然有点笔误,但我完全同意你的答案。 - John

11

我曾遇到相同的问题。在我的情况下,我将JAVA_HOME指向JDK文件夹而不是JDK\ bin文件夹来解决它。


9

5

我曾经遇到过这个问题,并在https://dev59.com/7Goy5IYBdhLWcg3wq_wk#8406221上评论说修复方法不好。(实际上是报告JAVA_HOME是其他内容,所以我建议脚本正在更改它)。

正如他们的回复所述,编译器不会说谎。

很真实,我最终发现我的旧JAVA_HOME变量是JDK_v7.0.7之类的,而我刚刚删除了它(从2012年恢复DVD),并更新为JDK_v7.7.1之类的。为什么它认为回退到JRE是方便呢?

例如

JAVA_HOME = c:\Java\JDK_v7.0.7

@运行脚本...@

也许JAVA_HOME没有指向JDK。它当前设置为 "C:\Program Files\Java\jre7"

@在cmd提示符下检查@

set
JAVA_HOME = c:\Java\JDK_v7.0.7

所以它有点在撒谎,不是吗?


3

我犯了一个错误,把JDK和JRE安装在了同一个位置。安装JDK会自动安装JRE,而我无意中选择了与JDK相同的位置。

这导致eclipse非常混乱。

请将JDK和JRE安装在不同的位置。


1
这是大多数初学者常犯的错误,
JRE仅用于运行基于Java的代码/应用程序。
如果要编译Java代码,必须使用JDK。
因此,请打开环境变量,并将JAVA_HOME路径设置为JDK文件夹,而不是JRE env variables截图

0

我在尝试使用ant安装基于Java的工具时遇到了这个错误。

我的$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/,解决了我的问题。

别忘了在更改后运行source ~/.bash_profile!希望对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接