为啥 ANT 告诉我 JAVA_HOME 是错误的,而实际上它不是?

Posted

技术标签:

【中文标题】为啥 ANT 告诉我 JAVA_HOME 是错误的,而实际上它不是?【英文标题】:Why does ANT tell me that JAVA_HOME is wrong when it is not?为什么 ANT 告诉我 JAVA_HOME 是错误的,而实际上它不是? 【发布时间】:2010-12-06 05:43:06 【问题描述】:

我得到错误:

C:\dev\ws\springapp\build.xml:81: 找不到 javac 编译器; com.sun.tools.javac.Main 不在类路径中。 也许 JAVA_HOME 不指向 JDK。 当前设置为“C:\Program Files\Java\jre6”

但我已明确将我的 JAVA_HOME 设置为 C:\Program Files\Java\jdk1.6.0_14

ANT 从哪里得到这个值?

【问题讨论】:

你是如何设置%JAVA_HOME%的?进行更改后,您是否重新启动了 Windows? 我原以为既然我们有了 Windows Vista,就不需要重新启动了——在不重新启动的情况下注册更改有多难。但你知道吗,这似乎起到了作用。 确实,在 XP 及更高版本中您不需要重新启动 Windows。但是您必须生成另一个控制台... 当您在 shell 中设置新的环境变量时,Windows 不会更改已运行程序的环境块。 请查看安装 Apache Ant。 ant.apache.org/manual/install.html 【参考方案1】:
    在 Eclipse 中单击运行外部工具外部工具配置。 单击 JRE 选项卡。 单击已安装的 JRE... 按钮。 单击添加按钮。 (如果适用,请选择标准虚拟机。) 点击目录按钮。 浏览到已安装 Java 的 JDK 版本(不是 JRE) (例如C:\Program Files\Java\jdk1.7.0_04)。 点击完成确定。 在Separate JRE处选择JDK并点击关闭。 重新运行您的 Ant 脚本 — 玩得开心!

这适用于我遇到的特定场景。

【讨论】:

【参考方案2】:

当您说您已将 JAVA_HOME“明确设置”为“C:\Program Files\Java\jdk1.6.0_14”时 - 这是您在命令行运行“set”时看到的内容吗?如果根本没有设置,我相信 Ant 会猜测 JAVA_HOME 的值...是否有可能您设置了 JAVAHOME 而不是 JAVA_HOME?

如果不是这样,我建议您编辑 ant.bat 批处理文件(以及它所调用的任何内容 - 我不记得它是否令人费解)以在开始时和其他各种有趣的地方打印出 JAVA_HOME .

【讨论】:

数小时后,就是这样。确保将 JAVA_HOME 设置为 C:\Program Files\Java\jdk1.6.0_14 。不是 jre 目录,不是 bin 目录 克里斯蒂安所说的是正确的做法。另外,记住不是;在路径之后。傻我知道。 "另外,记住不要在路径后面加上 ;。"感谢您的评论。【参考方案3】:

我在尝试使用以下命令运行 Ant build 时遇到了同样的问题:

java -cp ant.jar:ant-launcher.jar org.apache.tools.ant.Main

命令的输出是:

BUILD FAILED
XXX/build.xml:8: 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 "/usr/lib/jvm/java-6-openjdk/jre"

似乎 java 可执行文件选择“/usr/lib/jvm/java-6-openjdk/jre”作为 JAVA_HOME,而不是安装 JDK 的“/usr/lib/jvm/java-6-openjdk” .

我通过在我的<javac> 任务中设置fork="yes" 解决了这个问题。

看看:http://ant.apache.org/manual/Tasks/javac.html

【讨论】:

该死的。我完全忘记了叉子。谢谢! 您可能在 JDK/bin 之前的 PATH 中有 JRE/bin(安装程序会这样做)。因为 ant 是一个通过 java.exe 运行的 java 程序 - 如果它选择 JRE/bin/java.exe,它将根据 JRE 位置设置 JAVA_HOME。如果 JDK/bin 首先在路径中,它将从 JDK 获取 java.exe 并将 JAVA_HOME 设置为 JDK 位置。 fork="yes" 有效,因为运行了一个新进程,javac.exe 运行,它不在 JRE/bin 中,所以跳到 JDK/bin 并在那里找到它。干杯 - 马克【参考方案4】:

也有可能您在 JAVA_HOME 设置中包含 /bin,而 Ant 正在将 /bin 添加到其中 - 因此找不到任何 exe。它发生在我身上:

【讨论】:

我不能大声尖叫。这正是我做错的。当我将它指向 JDK 时,它一直在自动猜测,试图使用不存在的 JRE。这真是令人沮丧。正如@tom 所说,只需从您的 JAVA_HOME 中删除尾随 bin/,它就会起作用。【参考方案5】:

确保您使用尾随分号:这不起作用:

set JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_29;

这将:

set JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_29

【讨论】:

【参考方案6】:

我遇到了类似的问题。我将链接以从 Maven 构建运行 Ant 任务,但我遇到了问题。我已将其修复为以下步骤:

确保 JAVA_HOME 设置正确。您可以在命令行中的 Windows 上检查它: C:>回显%JAVA_HOME% 结果看起来像:C:\Progra~1\Java\jdk1.6.0_30\ 将文件 tools.jar 从 %JAVA_HOME%\lib 复制到 Maven 的 lib 目录。

它对我有用。

【讨论】:

【参考方案7】:

为了解决这个问题,在 window->preferences->ant-> runtime 中添加 tools.jar 文件。

【讨论】:

到类路径?如果是这样,是全局条目还是其他? 我在 Eclipse 中运行一个简单的嵌入式码头应用程序。我添加了 GLASSFISH JSP 支持,但一直收到此错误。我在这里尝试了几种解决方案。唯一对我有用的是这个建议……从 JDK lib 目录中添加 tools.jar。谢谢。【参考方案8】:

在 Eclipse 中,将已安装的 JRE 设置设置为 JDK - 在项目中(项目属性 -> Java 构建路径 -> 库),或首选项中的全局默认设置(Java->已安装的 JRE)。 eclispe设置比系统变量强。

【讨论】:

【参考方案9】:

我希望您了解系统和用户环境变量。用户优先于系统。如果您在系统变量中设置了 JAVA_HOME 并且如果在用户变量中有相同的条目,那么您将只获得后者。

右键单击我的电脑,进入属性,选择高级选项卡,然后单击环境变量以查看用户和系统环境变量的列表。

【讨论】:

【参考方案10】:

分号让我失望:我将 JAVA_HOME 设置为 "C:\jdk1.6.0_26;"而不是“C:\jdk1.6.0_26”。在遵循 Jon Skeet 的建议检查 ant.bat 文件后,我删除了结尾的分号。这是该文件的一部分:

if "%JAVA_HOME%" == "" goto noJavaHome
if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome

所以分号没有被修剪掉,导致找不到文件,因此默认为“C:\Java\jre6”或类似的东西。

令人困惑的部分是HowtoBuild 页面声明使用分号,但这似乎破坏了它。

【讨论】:

天啊...一个小时以来一直在与此错误作斗争。谢谢布兰登,这真的救了我。【参考方案11】:

我遇到了同样的问题,将 javac 标记中的可执行属性设置为 javac.exe 的位置为我解决了这个问题。 这解决了问题

<javac srcdir="$srcDir" destdir="$buildDir" fork="true" executable="C:\Program Files\Java\jdk1.7.0_03\bin\javac"/>

【讨论】:

【参考方案12】:

实际上在superuser.com上找到了这个答案,但是我不得不将tools.jar从我的JDK\lib目录复制到JRE\lib目录。

零意义...我能想到的唯一一件事是 Sun 在最新的 Java 运行时(Java 7 Update 11)中引入了这个错误,或者在 Ant 中读取当前 JDK 位置的错误(JRE 更新得更多)显然,JDK 比 Sun 也愚蠢...他们应该在每次更新 JRE 时发布 JDK)。

我的 JAVA_HOME 设置正确。我通过“设置 JAVA_HOME”确认。它指向我的 JDK 目录并且拼写正确。但是,Ant 声称找不到 javac,但认为 JAVA_HOME 在我的 JRE 目录中。

在最新的 Sun JRE7 更新(10 和 11)之前,我的系统运行良好。 Ant 是 1.8.4 版本

【讨论】:

【参考方案13】:

如果您设置了JAVA_HOME,但其中有错字,您还会看到对 jre6 路径的虚假引用。

【讨论】:

【参考方案14】:

如果其他一切都正确,请尝试以下操作

    转到窗口 -> 首选项 -> Ant -> 运行时 -> 类路径 展开全局条目并在此处查看可用的 jdk 工具。 从特定的java版本添加所需的tools.jar,例如“C:\Program Files\Java\jdk1.6.0_45\lib\tools.jar” 现在构建并检查结果。

注意:为您要使用的 java 编译器添加 tools.jar,当存在多个 tools.jar(java 编译器)时,通过将其在 tools.jar 列表中上移来优先使用它。

【讨论】:

【参考方案15】:

只需按照以下步骤设置 JDK 路径:

    转到“运行”->外部工具->外部工具配置

    -> 选择“JRE” 然后从下拉列表中选择可用的 JDK。前任。 jdk1.8.0_25

【讨论】:

【参考方案16】:

我遇到了同样的问题。 JAVA_HOME 指向的我的 JDK 包没有任何 tools.jar 确保你的 JDK 安装有 tools.jar

(显然消息错误令人困惑)

【讨论】:

【参考方案17】:

在环境变量中设置JAVA_HOME为D:\Program Files\IBM\SDP\jdk 不要给出任何引号或分号。这对我有用。请尝试解决方案。 实际上,在 ant.bat 中,它会检查适当的 JAVA_HOME,以防 ant.bat 找不到它,那么它的 JAVA_HOME 指向默认的 JRE。

【讨论】:

【参考方案18】:

我也遇到了同样的问题。我使用的是 Windows 7,并且安装了两个版本的 java。首先我安装了最新版本的 java 7,然后是版本 5。

我的java安装目录的内容:

C:\Program Files\Java>
jdk1.5.0_14
jdk1.7.0_17
jre1.5.0_14
jre7

我的 JAVA_HOME 设置为正确的值,即:

C:\>set ja
JAVA_HOME=C:\Program Files\Java\jdk1.5.0_14

但我还是遇到了同样的问题:

XXXXXXX\build.xml:478: The following error occurred while
executing this line:
XXXXXXX\build.xml:477: 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\jre7"

在尝试了这个帖子中的所有建议后,我意识到我的错误。我试图在“用户变量”而不是“系统变量”部分设置环境变量。在“系统变量”中设置它后,它工作正常。不过我面临另一个问题。

它指向的java默认版本还是7。

C:\>java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) Client VM (build 23.7-b01, mixed mode, sharing)

我不知道如何使它指向版本 5。

【讨论】:

【参考方案19】:

我在使用 Jenkins 构建项目时遇到了这个问题。首先是找不到ant.bat,通过将ant.bat的路径添加到系统环境变量路径来解决。然后ant找不到jdk目录。通过右键单击my computer &gt; properties &gt; advanced &gt; environment variables 并创建一个名为JAVA_HOME 的新环境变量并将其赋值为C:\Program Files\Java\jdk1.7.0_21 来解决此问题。不要在用户变量中创建此环境变量。仅在系统变量下创建它。 在这两种情况下,我都必须重新启动系统。

【讨论】:

【参考方案20】:

这个问题很常见。我无法在我的系统中设置任何特定的 Java 主目录,因为我有 2 个不同版本的 Java(Java 6 和 Java 7)用于不同的环境。 为了解决这个问题,我在打开 build.xml 文件时在运行配置中包含了 JDK 路径。 这样,2 个不同的构建文件使用 2 个不同的 Java 版本进行构建。 我认为这个问题可能有更好的解决方案,但至少上述方法避免设置 JAVA_HOME 变量。

【讨论】:

【参考方案21】:

仅供参考,我使用的是 Windows 7,必须重新启动 Windows 才能使新的 JAVA_HOME 设置生效。

【讨论】:

【参考方案22】:

遇到同样的问题;

c:\jb\src\build.xml:191: 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\jre7"

Total time: 0 seconds

c:\jb\src>echo %JAVA_HOME%
c:\Program Files\Java\jdk1.7.0_13

解决方案:

path = c:\ant\bin\;%PATH%
path = c:\Program Files\Java\jdk1.7.0_17\bin;%PATH%
set "JAVA_HOME=c:\Program Files\Java\jdk1.7.0_13"

我想单独的 jdk 路径指令可以做到这一点,但我懒得弄清楚上面的解决方案是防弹的。 :-)

同样使用 Windows7

【讨论】:

【参考方案23】:

快速解决同样的问题

将 C:\Program Files\Java\jdk1.6.0_14\lib\tools.jar 复制到 C:\Program Files\Java\jre6\lib\

这个异常即将到来,因为 JAVA_HOME 被设置为 C:\Program Files\Java\jre6 并且 Ant 无法在其中找到 tools.jar。

【讨论】:

【参考方案24】:

如果需要在 eclipse 中使用内置的 eclipse jdk 运行 ant,请在 build.xml 中添加以下行

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>

【讨论】:

以上是关于为啥 ANT 告诉我 JAVA_HOME 是错误的,而实际上它不是?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA_HOME 应该指向 JDK 还是 JRE?

设置 JAVA_HOME 时出错

为啥在 cmd 中运行 ant sonar 命令时出现错误?

在 Jenkins 的 Ant +Ivy 项目中构建错误

Java(Android)中的新功能。为啥 ANT DEBUG 显示错误“找不到符号”?

在cygwin中运行ant返回JAVA_HOME设置不正确