我正在编写一个利用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的主目录?
答案 0 :(得分:5)
不确定这是否适用于* nixes,但找到了这个解决方案:
JAVA_HOME="$( readlink -f "$( which java )" | sed "s:bin/.*$::" )"
我在Ubuntu上测试了它并且它可以工作,但它不适用于OSX。
答案 1 :(得分:3)
我的解决方案是编译本机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
$ make
测试生成的jsvc二进制应用程序
$ ./jsvc -help
有效!干净。
答案 2 :(得分:0)
使用dirname
和which
命令查找Java的bin目录:
echo `dirname \`which java\``
JAVA_HOME=`dirname \`which java\``
...仅当Java已经在$PATH
上时才有效。
答案 3 :(得分:0)
另一种方式是:
type -p java
期望这样可以返回正确的JAVA安装文件夹。