有关服务器上的多个JVM的最佳实践是什么?

许多第三方产品需要特定版本的JRE或JDK,而且我们的许多服务器都有多个职责。 应用程序团队认为他们不应该关心Java的安装位置。 大多数应用程序只是依赖于环境variables(或者任何Java恰好在其周围),但是需要特定版本的团队需要知道在哪里find他们的特定版本。 我不喜欢这样一个事实,即如果不访问所有可能使用它的应用程序,我现在就无法重新定位JVM。 显而易见的答案是创build一个程序来隐藏他们的细节,并通过API暴露位置。 这个解决scheme将要求每个Java应用程序都包含在一些查询环境的脚本中。

我不喜欢不必要的复杂性或重新发明轮子。 有没有一些标准的做法,内置到Java中的function,或者我失踪的明显解决scheme?

我曾经想过,每个应用程序都要pipe理其path中的一个链接,以指向它想要的Java,但我仍然需要告诉它们它在哪里。

理想情况下,你需要设置两个环境variables:

export JAVA_HOME=/java/location export PATH=$JAVA_HOME/bin:$PATH 

您可以创build不同的脚本来启动各种程序,并在每种情况下设置不同的variables。 或者,您可以将每个应用程序configuration为在不同的用户帐户下启动,并在用户适当的启动脚本中设置这些variables。

$ JAVA_HOME / bin需要首先在PATH上,以避免运行默认path上的任何其他的java二进制文件。

虚拟化就是我们在哪里工作的方式。

更新 – 很抱歉,如果我不清楚 – 我们将每个应用程序托pipe在自己的虚拟服务器上,只有它需要的JVM版本

符号链接的方法是好的,但考虑到你可能不想一次升级所有应用程序的jvm。

如果您正在处理任务关键型应用程序,那么您可能希望每个应用程序都有一个JVM,或者让每个应用程序直接指向特定版本的JVM。

例如,在我工作的地方有一个专门工作的应用程序(称为A),并针对特定的JDK和版本(JDK 1.5.0_03)进行了testing,后来的版本已知会将其分解。

如果应用程序A和另一个应用程序B都指向名为java-5的符号链接,然后在推出应用程序BI时决定将java-5更新为指向JDK 1.5.0_14,则应用程序A将中断。

正如“在版本控制下处理特定于系统的信息的最佳实践是什么?”所述,JVM的path可以是解变阶段的一部分。
即您的configuration文件可以重写在:

  • 部署时间,用特定于环境的值replace一些variables
  • 执行时间(在开始时),用特定于会话的值replace其他一些variables。

这意味着,就在应用程序的开始部分,我们把所有的程序查询放到一个数据库中,这个数据库包含了会话之间可能会改变的值。
最终的JVMpath就是其中之一。
查询是基于服务器(或服务器池)名称和程序名称。

在基于* 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中,您可以使用环境variables来做类似的事情。 然后你的启动脚本可以'设置JRE_HOME =%JAVA_5%'。

应用程序团队不能拥有这两种方式。

如果应用程序只支持JRE的一个版本,那么它应该随它一起发行。 它应该与应用程序一起安装。

我不明白为什么他们会想要任何其他方式。 这样做确保了他们testing应用程序的确切JRE版本您在生产中部署的相同。 当你在学校时,认为你不应该关心JVM是一个不错的理想,Java是“一次编写,运行在任何地方”。 但坦率地说,这个观点与现实世界并不一致,Java实际上是“一次写入,到处testing”。

如果应用程序团队不得不关心特定于JVM的问题,这将是一个支持的噩梦。 消除这种不确定性,吸取它并为每个应用程序使用一个JVM。 磁盘空间很便宜。

我们只是使用符号链接到我们想要使用的版本。 我们有许多机器在不同的地方安装了java,应用程序不需要知道它们在不同的盒子上。

另一个select是使用java webstart为你的应用程序。 在这种情况下,它甚至会下载并安装正确的版本,如果你没有它。

我使用从Sun提取的下载文件(保留默认目录名称)将所有内容放在/ opt / java-version中。 应用程序通常以自己的用户身份运行,并通过初始化脚本启动和停止,该脚本为该应用程序设置所有variables,包括$ JAVA_HOME。

如果我有一个应用程序,我总是使用/ opt中的“current”安装,我在/ opt中创build符号链接,并使init脚本指向那个符号链接。 当安装一个新的Java运行时,符号链接就会被调整。