为啥 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 > properties > advanced > 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 是错误的,而实际上它不是?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 cmd 中运行 ant sonar 命令时出现错误?