2010-08-02 68 views
15

如何在運行時獲取當前運行的JVM的可執行文件的位置?我想使用ProcessBuilder類實例化另一個JVM作爲子進程。在運行時確定JVM可執行文件的位置

我知道有java.home系統屬性,但是這並沒有指定JVM可執行文件的位置。我知道我可以做這樣的事情來獲取路徑:

System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"

此代碼不是獨立於平臺的,因爲Windows可執行文件的名字爲java.exe,不java。有沒有辦法讓JVM可執行文件的路徑考慮到平臺的特性?

+0

JAVA_HOME指向JDK而不是JRE。所以如果用戶沒有安裝JDK,那麼你的運氣不好。另外我*做*擁有JDK並且沒有環境變量。還是一切正常。同樣在Windows上,您可以將「.exe」放在要運行程序的文件名上。 – Joey 2010-08-02 22:57:06

+0

通過'java.home'系統屬性,我不是指環境變量;相反,我的意思是存在於'System.getProperties()'中的屬性。我已經驗證JRE具有'java.home'的System屬性。 在Windows中知道「.exe」擴展名是可選的,這很有用。謝謝。 – 2010-08-02 23:00:04

+0

你可以在Windows上做第一個註釋並假設「bin/java.exe」,並假設其他平臺上的「bin/java」。還有「javaw.exe」可以根據你想要做什麼來考慮。 – 2010-08-03 02:35:44

回答

-4

您試圖分叉整個JVM。

  1. 這是非常低效的,主要是因爲另一個java進程的沉重。如果您重這樣做,那麼你的程序將是很慢,因爲這個原因

存在

  • 線程但是,如果你真的必須,你可以嘗試只執行java -arguments直接,因爲大多數標準的Java安裝將java放在cli路徑上。

  • +0

    該問題沒有提到啓動的任何內容,所以您應該可能會說「如果你使用java.exe啓動時要小心......」。問題只是關於如何獲得正在運行的java exe。 – 2010-08-03 02:32:59

    +1

    除了jowierun寫的內容,還有*可以分叉JVM: 1. JVM之間沒有類加載衝突 - 這對於大型應用程序非常重要2.當運行昂貴的算法時,將其作爲單獨的進程運行是個好主意;它解決了內存限制 – 2010-08-05 22:39:56

    1

    是的,有一種方法可以獲取JVM可執行文件的路徑(如果存在)。將其包含在應用程序的配置中。有很多方法可以做到這一點:命令行參數 - java myApp.Main/path/to/Java;屬性 - java -Dpath.to.java =/path/to/java;等等。

    如果你想要真正的平臺獨立性,那麼你的整個方案是有缺陷的,因爲JVM可執行文件的存在不能保證。我可以想象一個JVM,不需要Java可執行文件。

    如果你想99.99%的平臺獨立性,那麼我認爲你有需要的工具。

    +6

    這不能回答我的問題。我正在問如何在運行時確定JVM可執行文件的位置*,而不是JVM啓動之前的先驗。你假設我正在控制JVM如何被調用,事實並非如此。 – 2010-08-05 22:43:25

    1

    這個討論有問題的一個有趣的討論涵蓋多個平臺: Finding current executable's path without /proc/self/exe

    鑑於討論,應該是可能的,如果你真的需要它,寫一些JNI包裝,的#ifdef當前平臺和進行正確的本地通話。

    如果你只在Linux上,'/ proc/self/exe'是一個符號鏈接到正在運行的實際可執行文件。這具有不依賴任何環境變量(即PATH或JAVA_HOME)的優點。但正如我所說,它絕對不是平臺獨立的。

    8

    你總是可以使用os.name來檢查用戶是否在運行Windows。這將在OS X,Linux和Windows上工作在

    String jvm_location; 
    if (System.getProperty("os.name").startsWith("Win")) { 
        jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java.exe"; 
    } else { 
        jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java"; 
    } 
    
    相關問題