2010-12-12 147 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