7

我正在编写一个应用程序,它利用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 主目录,以便我可以在大多数 Unixes/Linuxes 上进行这项工作?我晚上可以睡得更好,做一些类似的事情:

JAVA_HOME="$( ... )"

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

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

4

4 回答 4

5

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

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

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

于 2012-08-30T22:32:11.400 回答
3

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

这是我的分步程序

下载 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 身份执行以下操作:

$ 支持/buildconf.sh

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

$ 制作

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

$ ./jsvc -帮助

有用!干净地。

于 2013-02-27T18:26:08.720 回答
0

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

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

...仅当 Java 已经在$PATH.

于 2012-08-30T22:16:00.197 回答
0

另一种方法是:

 type -p java

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

于 2016-03-27T21:03:50.023 回答