【问题标题】:Cannot locate Java home找不到 Java 主目录
【发布时间】: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 的主目录?

【问题讨论】:

标签: java linux unix jsvc


【解决方案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 位置通常不在。
      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多