许多第三方产品需要特定版本的 JRE 或 JDK,而且我们的许多服务器都有多项任务。应用程序团队认为他们不应该关心 Java 的安装位置。大多数应用程序仅依赖于环境变量(或任何 Java 恰好存在的地方),但那些需要特定版本的团队需要被告知在哪里可以找到他们特定的版本。我不喜欢这样一个事实:现在我只能访问所有可能使用 JVM 的应用程序,而不能重新定位它。显而易见的答案是创建一个隐藏详细信息的程序,并通过 API 公开位置。此解决方案要求每个 Java 应用程序都包含在某个查询环境的脚本中。
我不喜欢不必要的复杂性或重新发明轮子。是否有一些标准做法、Java 内置功能或我遗漏的明显解决方案?
我想到的一个方法是让每个应用程序管理其路径中的链接以指向它想要的 Java,但我仍然需要告诉它们它在哪里。
答案1
理想情况下,您需要设置两个环境变量:
export JAVA_HOME=/java/location
export PATH=$JAVA_HOME/bin:$PATH
您可以创建不同的脚本来启动各种程序,并针对每种情况设置不同的变量。或者,您可以将每个应用程序配置为在不同的用户帐户下启动,并在用户适当的启动脚本中设置这些变量。
$JAVA_HOME/bin 需要首先出现在 PATH 上,以避免运行默认路径上的任何其他 java 二进制文件。
答案2
在我的工作中,我们处理这个问题的方法就是虚拟化。
更新 - 抱歉,如果我没有说清楚 - 我们将每个应用程序托管在自己的虚拟服务器上,并且只使用其所需的 JVM 版本
答案3
符号链接方法很好,但请考虑您可能不想一次升级所有应用程序的 jvm。
如果您正在处理关键任务应用程序,那么您可能希望每个应用程序有一个 JVM,或者让每个应用程序直接指向特定版本的 JVM。
例如,在我工作的地方有一个应用程序(称之为 A),它可以专门运行并针对特定的 JDK 和版本(JDK 1.5.0_03)进行了测试,但后来的版本会破坏它。
如果应用程序 A 和另一个应用程序 B 都指向名为 java-5 的符号链接,然后在推出应用程序 BI 时决定更新 java-5 以指向 JDK 1.5.0_14,则应用程序 A 将会中断。
答案4
在基于 *nix 的系统中,您可以使用软链接。然后只需编写启动脚本以使用它喜欢的最不具体的版本。JRE_HOME = /usr/lib/jre/java-5
/usr/lib/jre/...
java -> java-5
java-4 -> java-4-sun
java-5 -> java-5-sun
java-6 -> java-6-sun
java-4-sun -> java-4-sun-1.4.0.0
java-5-sun -> java-5-sun-1.5.0.14
java-6-sun -> java-6-sun-1.6.0.10
java-4-sun-1.4.0.1
java-5-sun-1.5.0.12
java-5-sun-1.5.0.14
java-6-sun-1.6.0.10
这是许多基于 Linux 的系统所使用的方法。请参阅 /etc/alternitives 和 /usr/lib/jre 以获取示例。
在 Windows 中,您可以使用环境变量来执行类似操作。然后您的启动脚本可以“set JRE_HOME=%JAVA_5%”。