【问题标题】:Unable to find a javac compiler找不到 javac 编译器
【发布时间】:2012-01-14 02:20:57
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

    标签: java ant war


    【解决方案1】:

    除了需要工具.jar 的 javac 任务(位于 JDK 的 /lib 目录中)之外,您所有的 ant 工具都可以正常工作,在这种情况下,JRE 是不够的。因此来自 ant 的提示:“无法找到 javac 编译器;...”

    使用 Eclipse 时,默认设置指向您的 JRE 安装。
    因此,第一次启动 Eclipse 后的第一步应该是:
    Window &gt; Preferences &gt; Java &gt; Installed JREs 并将设置从 JRE 更改为 JDK。
    或者使用:
    Window &gt; Preferences &gt; Ant &gt; Runtime &gt; Classpath &gt; Global Entries
    并从您的 JDK/lib 文件夹中添加 tools.jar

    【讨论】:

    • comp 没有说谎 ;) 你如何启动你的 ant 脚本?=
    • 不,我忘记了我在哪里评论我很慌张。实际上,我的路径变量中有错误的 JDK 版本,因为“全新安装”需要我删除过时的 Java。有点打字错误,但我现在完全同意你的回答。
    【解决方案2】:

    我遇到了同样的问题。就我而言,我通过将 JAVA_HOME 指向 JDK 文件夹而不是 JDK\bin 文件夹来修复它。

    【讨论】:

      【解决方案3】:

      目前您已将 JAVA_HOME 设置为已安装的 jre 而不是 jdk。 安装当前的 JDK,然后将 JAVA_HOME 设置为您的 JDK 目录。

      你会在这里找到当前的 jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html

      【讨论】:

        【解决方案4】:

        我遇到了这个问题,并在https://stackoverflow.com/a/8406221/866333 上评论说修复不好。 (实际上它报告说 JAVA_HOME 是别的东西,所以我建议一个脚本正在改变它)。

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

        的确如此,我最终发现我的旧 JAVA_HOME 变量类似于 JDK_v7.0.7,当时我刚刚删除了它(从 2012 年的恢复 DVD 中)并更新为类似于 JDK_v7.7.1。为什么它认为回退到 JRE 是合适的,假设这是一种方便。

        例如

        JAVA_HOME = c:\Java\JDK_v7.0.7

        @runs 脚本...@

        也许 JAVA_HOME 不指向 JDK。目前设置为 "C:\Program Files\Java\jre7"

        @在 cmd 提示符下检查@

        设置
        JAVA_HOME = c:\Java\JDK_v7.0.7

        这不是说谎吗?

        【讨论】:

          【解决方案5】:

          我错误地将 JDK 和 JRE 安装到同一个位置。安装JDK会自动安装一个JRE,我无意中选择了与JDK相同的位置。

          这在 eclipse 中造成了相当大的混乱。

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

          【讨论】:

            【解决方案6】:

            这是大多数初学者的常见错误,

            JRE 仅用于运行基于 java 的代码/应用程序。

            如果要编译java代码,必须使用JDK。

            所以打开环境变量,并将JAVA_HOME路径设置为JDK文件夹而不是JRE

            【讨论】:

              【解决方案7】:

              我在尝试使用 ant 安装基于 java 的工具时遇到此错误。

              我在 ~/.bash_profile 中的 $JAVA_HOME 环境变量设置为 /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,进行更改后! 高温

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-19
                • 2012-10-21
                • 1970-01-01
                • 1970-01-01
                • 2014-09-20
                • 1970-01-01
                相关资源
                最近更新 更多