Ant无法找到javac,JAVA_HOME在Ubuntu上无法设置

45

我在我的Ubuntu 10.04 i386服务器(无头)上有一个名为Hello的Android项目。它包含一个Android项目文件夹应该有的所有内容。我首先使用以下语法在项目文件夹中的bash中构建项目:

./android create project --target 5 --name HelloCompile --path ../../Projects/Hello --activity HelloActivity --package com.code.Hello

然后我尝试使用ant构建.apk文件,方法如下:

ant debug

我遇到了这个错误:

BUILD FAILED
/home/myusername/www/sdk/tools/ant/main_rules.xml:384: 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"

这让我感到非常困惑,因为在执行ant debug之前,我运行了以下命令:

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

我知道这个方法是可行的,因为在Bash Shell中运行printenv命令会返回:

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

更加复杂的是,将此行添加到我的/etc/environment文件中

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

这也没有解决问题 - 我仍然收到相同的错误。我所做的一切都无法改变Ubuntu仍然认为 /usr/lib/jvm/java-6-openjdk/jre 是JAVA_HOME的事实。出了什么问题?我已经花费了太多小时在此。

4个回答

79

您是否安装了JDK?

当您安装Ubuntu时,默认包中只会安装JRE。不幸的是,Ubuntu的软件包管理器将目录命名为如果JRE与JDK一起安装。尽管JDK不存在,但该目录被命名为java-6-openjdk

请按照以下步骤操作:

sudo apt-get install openjdk-6-jdk
它会在相同的目录中安装JDK。

哦天啊,我简直不敢相信我错过了那个 - 我确信我已经安装了它...我不知道JDK最初是怎么到那里的....真的很奇怪。无论如何,感谢你把它搞定了。实际上我很抱歉 - 这是一个非常愚蠢的错误。 - lollercoaster
6
对我来说效果很好,我不必问愚蠢的问题 :) 但得到了答案。 - user784435
注意:OpenJDK不是无头的。这个解决方案将在您的服务器上安装一大块GUI,无论您是否需要它。但这是一个简单的解决方案 :) - foo
在Debian上,安装了default-jdk后,这个问题对我来说得到了解决。 - 0 _
1
sudo apt-get install openjdk-8-jdk - Badr Bellaj

10

在注意到输出中的一个小项后更新:

你已经将 JAVA_HOME 设置为正确的位置,这是一个Java运行环境,可以让你运行Java程序,但不能进行开发。

缩短 JAVA_HOME/usr/lib/jvm/java-6-openjdk (注意删除尾部的 jre),之后你的 Ant 包装器 / 编译器检测代码就不会混淆了,因为它将指向你的Java开发环境的主目录,而不是嵌入的/相关的Java运行环境的主目录。

嵌入式的Java运行环境是为了确保你能够针对仅包含核心内容(不包括编译器工具)的Java提供测试。

--- 原始帖子如下 ---

找到 javac 命令与 JAVA_HOME 的关系不大,除了 javac 通常在 JAVA_HOME 的子目录下。

你需要做的是修改你的 PATH 环境变量,以包括Java可执行文件所在的目录。通常是这样完成的:

PATH=${PATH}:${JAVA_HOME}/bin
export PATH

但是根据您的设置,可能会有所不同。如果您这样做

ls ${JAVA_HOME}/bin

如果你看到一个javac可执行文件,那么上述路径变量的修改将可以正常工作,无需进行任何更改。


好的,我已将这两行添加到/etc/profile文件中,然后退出了SSH,重新登录并再次尝试运行ant debug。但是仍然出现完全相同的错误。 - lollercoaster
1
@lollercoaster,我敢打赌问题可能是这样的。如果你运行echo $path会输出什么内容?另外,which javac会有什么反应? - corsiKa
好的,我注意到了一个小错误,你将JAVA_HOME指向了JDK的嵌入式运行环境,而不是指向开发环境。嵌入式运行环境缺少编译工具;因为,它只是用来测试你是否能够运行代码(而不是编译代码)。 - Edwin Buck
输入'locate javac'命令查找编译器bin目录的路径,并将其添加到$PATH变量中。如果没有结果,则只安装了JRE而非JDK。 - nsfyn55
1
username@myserver:~$ locate javac /etc/alternatives/javac /etc/alternatives/javac.1.gz /usr/bin/javac /usr/lib/jvm/java-1.5.0-sun-1.5.0.22/bin/javac /usr/lib/jvm/java-1.5.0-sun-1.5.0.22/man/ja/man1/javac.1.gz /usr/lib/jvm/java-1.5.0-sun-1.5.0.22/man/man1/javac.1.gz /usr/share/man/man1/javac.1.gz /usr/share/vim/vim72/compiler/javac.vim /usr/share/vim/vim72/syntax/javacc.vim /var/lib/dpkg/alternatives/javac - lollercoaster
显示剩余3条评论

2
正如Edwin Buck所说,在/usr/bin/目录中检查您的$PATH软链接到/etc/alternatives/java。它们会在您附加的JAVA_HOME变量之前被读取。
这就是我的问题:
ls -al /usr/bin/j* 
lrwxrwxrwx 1 root root    22 2012-05-07 13:26 /usr/bin/java -> /etc/alternatives/java
lrwxrwxrwx 1 root root    25 2011-05-12 19:45 /usr/bin/java_vm -> /etc/alternatives/java_vm
lrwxrwxrwx 1 root root    24 2011-05-01 05:22 /usr/bin/javaws -> /etc/alternatives/javaws
lrwxrwxrwx 1 root root    26 2011-05-12 19:45 /usr/bin/jcontrol -> /etc/alternatives/jcontrol
lrwxrwxrwx 1 root root    23 2011-04-26 02:24 /usr/bin/jexec -> /etc/alternatives/jexec

1
更改JAVA_HOME和PATH是不够的。
在安装所需版本的Java JDK(Java DEVELOPMENT Kit,而不仅仅是Java Runtime Environment JRE)之后,使用sudo update-alternatives --config java更改您首选的版本。如果您使用的是Ubuntu,则可能已安装1.6和1.7,并且1.8可在PPA中获得(尽管我找不到一个不旧的1.8 PPA)。

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