【问题标题】:Ant not using my JAVA_HOME to find tools.jarAnt 没有使用我的 JAVA_HOME 来查找 tools.jar
【发布时间】:2018-07-11 17:05:39
【问题描述】:

我意识到这个问题最初听起来像是其他一些问题的重复,但我看过的其他问题都没有解决我的问题。

简而言之,我在不同的位置安装了 JRE 和 JDK。我将JAVA_HOME 设置为指向JDK,但ant 似乎仍在JRE 位置搜索tools.jar。我不确定这是否与我的 ant 安装/配置或我的 JDK 安装/配置有关。

长篇大论:

环境

我在一个没有任何 sudo 权限的帐户上运行 Red Hat Enterprise Linux Server 7.5 (Maipo)。

我的 JDK 安装

机器已经在/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/jre/bin/java 安装了JRE。我不允许修改该安装,但我可以在单独的位置创建自己的 java 安装。

我的网络的安全要求非常严格,我只能在机器上安装特定的软件。可以为其他软件申请许可,但我必须经历一个非常痛苦的审批过程。我已获得将 openJDK 中的 JDK 1.8 放在机器上的权限。

由于 openJDK 不发布整个安装的 tar 球,并且由于我没有 sudo 权限,我尝试通过将 java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64.rpmjava-1.8.0-openjdk-devel-1.8.0.172-13.b11.fc29.x86_64.rpm 下载到 /local/apps/openJDK8 并运行(来自 /local/apps/openJDK8)来安装 JDK

rpm2cpio < java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64.rpm | cpio -i --make-directories
rpm2cpio < java-1.8.0-openjdk-devel-1.8.0.172-13.b11.fc29.x86_64.rpm | cpio -i --make-directories

由于某种原因,这似乎没有进行完整的 JDK 安装(我想我一定缺少一些依赖项)。我发现缺少 libjava.so、libjvm.so、jvm.cfg 和服务器文件夹,所以我只是创建了一些指向拥有它们的 JRE 安装的链接(从local/apps/openJDK8 运行):

ln -s /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/amd64/jvm.cfg usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64/lib/amd64/jvm.cfg
ln -s /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/amd64/libjava.so usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64/lib/amd64/libjava.so
ln -s /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/amd64/libjvm.so usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64/lib/amd64/libjvm.so
ln -s /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/amd64/server usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64/lib/amd64/server

这一步让我有点紧张,所以这可能是我的问题的一部分。无论如何,javac 和 java 似乎都可以正常工作。

蚂蚁安装

对于我的 ant 安装,我只是下载了一个 tar 球并将其解压缩到 /local/apps/ant,然后:

export JAVA_HOME=/local/apps/openJDK8/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64
export ANT_HOME=/local/apps/ant/apache-ant-1.10.4

我没有费心更新路径,因为现在我只是对所有内容使用完全限定的路径。我的最终目标是让 Jenkins 运行所有这些,它只使用完全限定的路径。

结果

现在如果我尝试运行 ant,我会得到:

> /local/apps/ant/apache-ant-1.10.4/bin/ant
Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/tools.jar
Buildfile: build.xml does not exist!
Build failed

build.xml does not exist 部分当然是意料之中的,但无法找到tools.jar 需要解决。对我来说最奇怪的是,根据错误信息,它实际上是在JRE安装位置寻找它。

由于ant 本身只是一个shell 脚本,因此我对其进行了修改,通过在文件末尾添加以下行来打印出更多信息,使其看起来像:

echo Running $ant_exec_command $ant_exec_args
echo JAVA_HOME = $JAVA_HOME
echo JAVACMD = $JAVACMD
echo CLASSPATH = $CLASSPATH
echo LOCALCLASSPATH = $LOCALCLASSPATH
echo ANT_HOME = $ANT_HOME
echo ANT_LIB = $ANT_LIB
eval "$ant_exec_command $ant_exec_args"

现在的输出是:

$ /local/apps/ant/apache-ant-1.10.4/bin/ant
JAVA_HOME is /local/apps/openJDK8/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64
Running exec "$JAVACMD" -classpath "$LOCALCLASSPATH" -Dant.home="$ANT_HOME" -Dant.library.dir="$ANT_LIB" org.apache.tools.ant.launch.Launcher -cp "$CLASSPATH"
JAVA_HOME = /local/apps/openJDK8/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64
JAVACMD = /local/apps/openJDK8/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64/bin/java
CLASSPATH =
LOCALCLASSPATH = /local/apps/ant/apache-ant-1.10.4/lib/ant-launcher.jar
ANT_HOME = /local/apps/ant/apache-ant-1.10.4
ANT_LIB = /local/apps/ant/apache-ant-1.10.4/lib
Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/tools.jar
Buildfile: build.xml does not exist!
Build failed

所以JAVA_HOME 是明确设置的。我什至可以进一步验证 ant 实际上使用了我为至少某些东西设置的 JAVA_HOME 值,因为如果我删除我在 JDK 安装中创建的所有这些链接,它会抱怨找不到 libjava.so .

所以 ant 显然至少使用了我的 JDK 安装,但仍在寻找旧的 JRE 安装以获取 tools.jar

有什么想法吗?

【问题讨论】:

  • ls /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib 的输出是什么?
  • 是系统提供的JDK不能使用的原因吗?看起来它是你所拥有的最新版本之后的一个非常小的版本,除非你被那个小版本修复的任何错误所困扰,否则我不会担心安装我自己的。
  • @David,系统提供的 java install 实际上只是一个 JRE,而不是 JDK。这有点令人困惑,因为它的名称中有“openJDK”,但它只是由 openJDK 生成的 JRE。
  • @CAustin,没有/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/ 中的唯一文件夹是 jre。这是因为现有安装只是 JRE 而不是 JDK(请参阅上面对 David 评论的回复)。

标签: java linux ant rpm


【解决方案1】:

想通了:)

与实际修复相比,此修复更像是一种解决方法,所以如果其他人有更好的解决方案,我很想听听。

我浏览了一下 ant 源代码,发现 ant 有一个 --launchdiag 属性,这很有帮助。跑步给了我:

/local/apps/openJDK8/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64/bin/java -classpath /local/apps/ant/apache-ant-1.10.4/lib/ant-launcher.jar -Dant.home=/local/apps/ant/apache-ant-1.10.4 -Dant.library.dir=/local/apps/ant/apache-ant-1.10.4/lib org.apache.tools.ant.launch.Launcher --launchdiag
Launcher JAR= "/local/apps/ant/apache-ant-1.10.4/lib/ant-launcher.jar"
Launcher JAR directory= "/local/apps/ant/apache-ant-1.10.4/lib"
java.home= "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/jre"
Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64/lib/tools.jar
tools.jar= "null"
Setting "java.class.path" to "/local/apps/ant/apache-ant-1.10.4/lib/ant-launcher.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-antlr.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-swing.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-testutil.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-xalan2.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-junitlauncher.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-xz.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-junit.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-log4j.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-javamail.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-bsf.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-resolver.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-oro.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-bcel.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-jai.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-jsch.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-jmf.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-commons-logging.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-launcher.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-jdepend.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-commons-net.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-netrexx.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-junit4.jar:/local/apps/ant/apache-ant-1.10.4/lib/ant-apache-regexp.jar"
Buildfile: build.xml does not exist!
Build failed

在代码中我发现java.home 属性来自System.getProperty("java.home"),这显然与JAVA_HOME 不同

通过添加 -Djava.home=$JAVA_HOME 我能够让它工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2017-04-05
    • 2012-02-25
    相关资源
    最近更新 更多