找不到 Java 主目录

Posted

技术标签:

【中文标题】找不到 Java 主目录【英文标题】:Cannot locate Java home 【发布时间】:2012-08-25 17:39:04 【问题描述】:

我正在编写一个应用程序,它利用jsvc 将Java 服务作为守护程序启动。我需要使用 jsvc 之类的东西,因为我的应用程序使用 1024 以下的端口,但我真的不想以 root 身份运行它,以便创建的文件归另一个用户所有。我还想将依赖项和配置保持在最低限度,以便所有客户端需要一个 JVM 和安装的 jsvc 二进制文件。

但是,jsvc 似乎有一个主要问题;它无法在给定的 Unix 操作系统上检测到 Java 的主文件夹,这非常令人沮丧:

$ ./startup.sh
Cannot locate Java home

至少通过手动设置 JVM 主目录,我已经能够在 Ubuntu 上解决这个问题:

jsvc ... -home /usr/lib/jvm/default-java/ ...

有什么方法可以从 Bash 脚本动态确定 Java 主目录,以便我可以在大多数 Unix/Linux 上进行这项工作?晚上我可以通过以下方式睡得更好:

JAVA_HOME="$( ... )"

jsvc ... -home "$JAVA_HOME" ...

...而不是对每个单独的操作系统进行硬编码。有没有办法,给定一个 java 二进制文件,我可以找到它的 JVM/JRE 的主目录?

【问题讨论】:

What is the correct target for the JAVA_HOME envrionment variable for a Linux OpenJDK debian-based distribution? 的可能重复项 不是重复的;我正在尝试一般地定位 Java 主页,不仅适用于 Debian 发行版,还适用于 Red Hat、OSX 和其他 Linuxes/Unix。 请阅读 SO 链接。尤其是关于“update-java-alternatives/update-alternatives”的部分。 【参考方案1】:

不确定这是否适用于 *nixes,但找到了这个解决方案:

JAVA_HOME="$( readlink -f "$( which java )" | sed "s:bin/.*$::" )"

我已经在 Ubuntu 上对其进行了测试,它可以工作,但它不适用于 OSX。

【讨论】:

【参考方案2】:

我的解决方案是编译原生 linux 源代码,正如 jsvc 主页面在 http://commons.apache.org/proper/commons-daemon//jsvc.html

这是我的一步一步的过程

下载 www.fightrice.com/mirrors/apache/commons/daemon/source/commons-daemon-1.0.13-src.tar.gz

解压文件后,转到...../commons-daemon-1.0.13-src/src/native/unix

以 root 身份在终端中执行以下操作:

$ support/buildconf.sh

$ ./configure --with-java=/usr/lib/jvm/default-java

$ 制作

测试生成的 jsvc 二进制应用程序

$ ./jsvc -帮助

有效!干净利落。

【讨论】:

【参考方案3】:

使用dirnamewhich命令查找Java的bin目录:

echo `dirname \`which java\``
JAVA_HOME=`dirname \`which java\``

... 仅当 Java 已在 $PATH 上时才有效。

【讨论】:

返回/usr/bin,这无疑(并且可重复地)失败了。由于which java 返回/usr/bin/java,这就是我得到的。【参考方案4】:

另一种方法是:

 type -p java

期望这会返回正确的 JAVA 安装文件夹。

【讨论】:

它没有。它的失败方式与EthanB's answer 完全相同。由于 java 的别名为/usr/bin,它在 PATH 上,而 jvm 位置通常不在。

以上是关于找不到 Java 主目录的主要内容,如果未能解决你的问题,请参考以下文章

在CMD下用java命令出现“找不到或无法加载主类”问题

java无法找到或加载主类是怎么回事?

MAC 找不到或无法加载主类怎么解决

java中找不到主类是啥问题

Java 错误:找不到或无法加载主类

java HelloWorld 提示“错误: 找不到或无法加载主类 HelloWorld“解决方案