JAVA_HOME没有指向JDK

31

我正在尝试跟随一个关于如何使用Ant构建和运行应用程序的教程。我已经按照所有步骤创建了构建文件,但是当我尝试运行Ant时,它会给我这个错误信息。

BUILD FAILED /home/bilal/tmp/ant/build.xml:19: 找不到javac编译器; com.sun.tools.javac.Main不在类路径上。 可能JAVA_HOME没有指向JDK。 当前设置为“/usr/lib/jvm/java-6-openjdk/jre”

有任何解决此问题的想法吗?

16个回答

36

JAVA_HOME变量指向jdk安装目录,而不是jre

你正在引用运行时环境,而不是开发工具包 —— 它找不到编译器,因为它不存在。

从你发布的那一行中,可以看出你正在使用open-jdk,只需删除末尾的jre即可:

export JAVA_HOME='/usr/lib/jvm/java-6-openjdk/'

5
错误信息已经告诉你,当前路径为"/usr/lib/jvm/java-6-openjdk/jre"。只需删除末尾的"jre"即可。 - kritzikratzi
20
我执行了这个命令export JAVA_HOME=/usr/lib/jvm/java-6-openjdk/,但是仍然遇到了同样的错误,指出它当前设置为"/usr/lib/jvm/java-6-openjdk/jre"。 - comatose
16
这被标记为解决方案,但它并没有提供解决方案。 - Vincent Cantin
10
这篇答案并没有给出解决方案,为什么它会被接受和赞同? - quinestor
2
@NimChimpsky,我刚刚根据ingyhere的答案解决了Ubuntu12.04上的问题。更改JAVA_HOME并不能解决该问题,因为ant不会使用该值,并且始终显示它指向jre子文件夹。 - quinestor
显示剩余12条评论

25

您安装了 Java...

apt-get install default-jre

但并非 JDK...

apt-get install default-jdk

1
@ingyhere 在这里建议安装 default-jdk 解决了我的问题。 - Mark Stosberg
@Mark Stosberg 首先,我删除了早期的评论,因为它是要跟进另一个答案的评论。出于记录的目的,此页面上的上下文也不清楚。所以,Ant应该在JRE内运行,并不受影响。但是,要编译应用程序,需要使用JDK。Ant Javac任务应该(或者至少曾经)通过嗅探内部属性来默认查找Java编译器(javac)。因此,如果没有明确指定Javac“可执行”属性,则可能会找到错误的内容。安装JDK是前提条件,当然,没有它就是问题。 - ingyhere

13
这是有意设计的。你不能将ant的java.home(它是一个java.lang.System属性)与操作系统环境中设置JAVA_HOME的方式混用。你可能正在尝试使用来自不同属性层的根本不同值来确定Java编译器的位置,即java.home(来自Ant的Java内部)指向安装在<any_installed_java_pointed_to_by_ant>/jre下的Java运行时环境,而JDK_HOME(来自操作系统环境)通常设置为<DOWNLOADED_AND_INSTALLED_JAVA_DEVELOPMENT_KIT>
更多细节请参见我的问题和答案: Ant设置其'java.home'的位置(是否错误),是否应该附加'/jre'? 解决方案是通过使用${env.JAVA_HOME}在Ant中访问系统环境属性。 在Javac任务中显式指定要使用的java,将executable属性设置为javac路径,并将fork属性设置为yes(请参见Ant's Javac Task Documentation)。 这样,无论Ant运行在什么Java环境中,编译器总是清晰地指定!

3
我不会说这是解决方案。它解释了发生了什么,但没有说明如何修复它。我遇到了同样的问题,而且是 Ant 在混淆 java.home 和 JAVA_HOME 的使用,而不是我自己。我的 JAVA_HOME 是正确的,但是 Ant 似乎在其末尾添加了 "/jre" 并抱怨它! - Dave Rager
@Dave Rager:Ant正在按照设计的功能运行。 - ingyhere
2
我没有使用java.home,而是使用Ant。它告诉我我的JAVA_HOME不正确,并将其java.home作为值给出。这对我来说似乎很糟糕。 - Dave Rager
Java Runtime Environment (JRE)的安装目录。请注意,它并不是Java开发工具包(JDK)。它是根据应用程序执行的虚拟机检测到的。 - ingyhere

5

我知道这个问题很老,但是接受的答案已经不再适用了。由于这是谷歌搜索结果中的第一个链接,我将告诉你我如何解决这个问题。

对于在Ubuntu上使用eclipse:

进入“Window->Preferences->Ant->Runtime->选择Ant_Home_Entries”,然后点击“添加外部JAR文件”,找到你的JDK所在的位置(默认情况下在/usr/lib/jvm/),在JDK的lib文件夹中,你会找到tool.jar。选择它并单击"应用"。

尝试构建你的项目,事情应该能够正常工作!

注意:我很久没有使用ant了,但需要它来生成ycsb couchbase负载生成器(http://www.couchbase.com/wiki/display/couchbase/Load+Generator+Setup)。如果有人卡在这里,请参考。


3

看起来您当前指向的JAVA_HOME是/usr/lib/jvm/java-6-openjdk/jre,这似乎是一个JRE而不是JDK。请尝试将JAVA_HOME设置为/usr/lib/jvm/java-6-openjdk

JRE不包含Java编译器,只有JDK(Java开发工具包)才包含它。


2
我正在使用Windows 7,也遇到了同样的问题。我通过更改我的环境变量来解决它。
要更改您的环境变量,请点击此处
我在路径变量的末尾添加了“;%JAVA_HOME%/bin”,并添加了一个新的“JAVA_HOME”变量,并将其值设置为我的JDK位置“C:\Program Files\Java\jdk1.8.0_11”。之后,我重新启动了我的Node.js命令提示符,然后它就可以工作了。
请注意,您的JDK目录可能与我的不同。另外,根据您的设置,设置环境变量后您可能需要重新启动计算机。

1

你上面的JAVA_HOME只指向JRE,它不包含编译器。请将你的JAVA_HOME设置为

/usr/lib/jvm/java-6-openjdk

...请重试。


其他人已经给出了这个答案,你只是重复别人的话。 - Ali

1

对于CentOS,使用yum -y install java-1.7.0-openjdk-devel.x86_64命令安装Java开发包。

并更新JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86-64。


1
我曾遇到类似的问题,最后发现是同时安装了OpenJDK的6和7两个版本。答案来自ubuntu论坛上的r-senior(http://ubuntuforums.org/showthread.php?t=1977619),只需卸载版本6即可:

sudo apt-get remove openjdk-6-*

确保JAVA_HOME和CLASSPATH没有被设置为任何值,因为那并不是实际的问题。


1

我只是将JDK\lib文件夹中的tools.jar文件复制到JRE\lib文件夹中。从那时起,它就像一位冠军一样工作。


这并没有提供问题的答案。如果要批评或寻求作者的澄清,请在他们的文章下方留言 - 您始终可以在自己的帖子上发表评论,一旦您拥有足够的 声望,您将能够评论任何帖子。- 来自评论审核 - mjp66
@mjp66,你试过了吗?它没有提供问题的答案?怎么会这样?我认为我们不仅需要作者的澄清,还有任何遇到类似问题的人都可以澄清。而且什么是足够的声望??? - Shiva Krishna Chippa
这是最好的答案!它起作用,而且不需要我不知道该在哪里写的命令。 - Maude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接