找不到 javac 编译器
Posted
技术标签:
【中文标题】找不到 javac 编译器【英文标题】:Unable to find a javac compiler 【发布时间】: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。
【问题讨论】:
【参考方案1】:除了需要工具.jar 的 javac 任务(位于 JDK 的 /lib 目录中)之外,您所有的 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
【讨论】:
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://***.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,进行更改后! 高温
【讨论】:
以上是关于找不到 javac 编译器的主要内容,如果未能解决你的问题,请参考以下文章
javac编译出来的程序运行报错“错误: 找不到或无法加载主类”