我正在尝试使用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。
答案 0 :(得分:68)
除了javac任务需要位于JDK的/ lib目录中的tools.jar之外,所有你的ant都能正常工作,在这种情况下JRE是不够的。因此来自ant的提示:“无法找到javac编译器; ......”
使用Eclipse时,默认设置指向JRE安装
因此,第一次启动Eclipse后的第一步应该是:
Window > Preferences > Java > Installed JREs
并将设置从JRE更改为JDK
或者使用:
Window > Preferences > Ant > Runtime > Classpath > Global Entries
并从JDK / lib文件夹中添加tools.jar
答案 1 :(得分:11)
我遇到了同样的问题。在我的例子中,我通过将JAVA_HOME指向JDK文件夹而不是JDK \ bin文件夹来修复它。
答案 2 :(得分:9)
目前,您已将JAVA_HOME设置为已安装的jre而不是jdk。 安装当前的JDK,然后将JAVA_HOME设置为JDK目录。
你会在这里找到当前的jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html
答案 3 :(得分:5)
我遇到了这个问题并对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
也许JAVA_HOME没有指向JDK。它目前设置为 “C:\ Program Files \ Java \ jre7”
设置
JAVA_HOME = c:\ Java \ JDK_v7.0.7
所以有点谎言不是吗?
答案 4 :(得分:3)
我犯了将JDK和JRE安装到同一位置的错误。安装JDK会自动安装JRE,我无意中选择了与JDK相同的位置。
这引起了日食的相当大的混乱。
将JDK和JRE安装到不同的位置。
答案 5 :(得分:1)
答案 6 :(得分: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/, 为我解决了这个问题。
在进行更改后,不要忘记运行源〜/ .bash_profile! HTH