我意识到这个问题最初听起来像是其他一些问题的重复,但我看过的其他问题都没有解决我的问题。
我在不同的位置安装了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 ball,而且我没有sudo权限,我试图通过将java-1.8.0-openjdk-1.8.0.172-13.b11.fc29.x86_64.rpm
和java-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似乎工作得很好。
蚂蚁安装
对于我的蚂蚁安装,我只是下载了一个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
我没有麻烦更新路径,因为现在我只是对所有内容使用完全限定的路径。我的最终目标是让詹金斯运行所有这些,它只使用完全合格的路径。
结果
现在,如果我试图运行蚂蚁,我会得到:
> /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安装,但仍在查找tools.jar
的旧JRE安装。
有什么想法吗?
想好了:(
这个修复仍然感觉更像是一个变通方法,而不是一个实际的修复,所以如果其他人有更好的解决方案,我会很有兴趣听到它。
我浏览了蚂蚁的源代码,发现蚂蚁有一个--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
,我可以让它在上工作