2010-12-12 65 views

回答

6

这是不可能的,一般来说。

@ khachik回答中提供的配方不一定适用于Java的非Sun实现。

  • Java可执行文件不一定叫java,不一定住在bin子目录。即使使用Sun Java,在Windows上也有两个可执行文件; javajavaw

  • 对于不同的Java实现,启动JVM的命令的命令选项是不同的。因此ProcessBuilder步骤可能涉及不可移植的参数。


虽然大多数JVM都采用主Sun java命令选项,有许多不同之处。例如:

  • IBM J9使用j9j9w为可执行文件名称。
  • BEA/Oracle JRockit有不同的-X-XX选项。
  • Jikes RVM使用rvm作为可执行文件的名称,并且仅支持Sun的java选项的子集
  • IKVM使用ikvm作为可执行文件的名称。

(注:这些都只是在各自的在线文档的粗略浏览脱颖而出的例子。)

+0

任何链接以支持您的第一个索赔? – 2010-12-12 14:06:16

10

您可以使用java.home系统属性来查找当前JVM:

String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"), 
               "bin"), 
           "java").getAbsolutePath(); 

,然后使用ProcessBuilder(或Runtime.exec)运行它。

请注意,对于JDK java.home指向包含在JDK中的JRE目录。

1

您是否尝试过使用Apache共享库?如果你还没有尝试launcher project。这段时间对我来说非常有用。

下面是从他们的网站项目介绍:

启动程序组件的设计是一个跨平台的Java应用程序启动。

原始Java类来自Tomcat 4.0项目。

Commons-launcher无需启动批处理脚本或shell脚本来启动Java类。在某些情况下,可能需要删除批处理或外壳脚本:

  • 您希望避免必须确定某些应用程序路径的位置。您的应用程序的主目录等。在Windows批处理脚本中动态确定此操作对于某些版本的Windows或在Unix平台上使用softlink时非常棘手。
  • 您希望避免必须处理本机文件和路径分隔符或本机路径引用问题。
  • 您需要强制执行某些系统属性,例如java.endorsed.dirs与JDK 1.4一起运行时。
  • 您希望允许用户传递自定义JVM参数或系统属性,而无需在脚本中解析和重新排序参数。这在批处理脚本和shell脚本中可能会非常棘手和/或混乱。 您希望从配置文件引导系统属性,而不是将它们硬编码到批处理脚本和shell脚本中。
  • 您想提供本地化的错误消息,这在批处理脚本和shell脚本中非常棘手。
+0

如果我理解它,那么它不会启动Java进程,除此之外我知道可执行文件的任何外部进程。但这是问题。我不知道当前的可执行文件。 – Horcrux7 2010-12-12 20:54:53