2017-12-21 221 views
5

Yeni bir Java sürecini başlatan JRE (JRE (varsayılan) JRE (benim durumumda 8). Bunun yerine, orijinal işlemi çalıştıran sürümle çalışmasına ihtiyacım var (ör. JDK 9).Geçerli bir işlemle geçerli bir Java işlemi başlatılıyor

Bunu nasıl yapabilirim?

Detaylar

Kod şu anda sadece bir java ... komutu vererek varsayılan sistem JRE dayanır (çözüm Java 8 ve 9 hem üzerinde çalışması gerekiyor). Bir alternatif, System.getProperty("java.home") + "/bin/java" (ancak platformdan bağımsız) olan bir şey kullanmaktır, ancak her ikisinde de aynı sorun vardır (benim için): Sistem tarafından bilinen JVM sürümü ile bir Java işlemi başlatırlar.

GÜNCELLEME: tamamen yanlış, System.getProperty("java.home") gerçekten ne istiyorum yapar ve geçerli JVM giriş dizinini döndürür. (Aptal bana, bunu denediğimi sanmıştım.)

Aynı Java sürümü ile başlatmanın bir yolu, geçerli işlemin bu dosyayı sorup yeniden kullanacağını sormak olurdu, ancak bunun için bir API bulamadım.

+3

'System.getProperty (" java.home ")' size şu anki JRE'yi verir, varsayılan değil JRE –

+0

@IngoKegel Tamamen haklısınız, bunun nasıl kaçtığını bilmiyordum ... Teşekkürler! – Nicolai

cevap

3

, buyur:

static String getJavaRuntime() throws IOException { 
    String os = System.getProperty("os.name"); 
    String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + 
      (os != null && os.toLowerCase(Locale.ENGLISH).startsWith("windows") ? "java.exe" : "java"); 
    if (!new File(java).isFile()) { 
     throw new IOException("Unable to find suitable java runtime at "+java); 
    } 
    return java; 
} 

diğer ayrıntılar için aşağıdaki gereksinimleri vardır ki, JOSM en restart action bu işler nasıl bir göz atabilirsiniz:

  • iş java J ile
  • çalışmaları (örn bir IDE) doğrudan bir kavanoz dosya veya sınıf dosyalarını çalıştıran Java 8+, Linux, Windows ve MacOS üzerinde
    • eser içeren yolları ile ava Web Start ve MacOS paketlenmiş uygulamaları
    • çalışma alanı karakterleri

    kod ilerler şöyle:

    • java.home sistem, tesisi
    • kontrolleri kullanarak java çalışma zamanını bulur sun.java.command sisteminin olmadığını özellik mevcut (IBM JVM için geçerli değil), daha sonra program ana sınıfını ve program argümanlarını ayıklar.
    • JNLP (WebStart) ilişkin bir sürü şey de var Runtime.getRuntime().exec

    kullanarak komutu çalıştırır, -cp veya -jar argümanlar ekleyerek önceki adımda

  • bulunabilir şeye bağlı komut satırı ya reconstructs ve macOS uygulamaları.İlgilenmediğini sanıyorum ama istersen açıklayabilirim.

  • +0

    Ama bu java.home' system özelliğinde bulunan yürütülebilir dosyayı kullanmıyor mu? Çünkü bu benim faturama uymuyor. – Nicolai

    +0

    İyi olmalı. Tüm testlerimiz java.home' özelliklerinin mevcut Java çalışma zamanı, varsayılan sistem değil ile doldurulduğunu gösteriyor. Kontrol ettin mi? – vip

    +0

    Eminim bunu denedim ama aynı şeyi keşfetmeye başlıyorum ... garip. Daha fazla testten sonra döneceğim ... – Nicolai

    3

    Yalnızca Java 9 için çözüm.

    ProcessHandle.current().info().command().map(Paths::get).orElseThrow(); 
    

    ile cari Java çalıştırıcısının ele almak: <JAVA_HOME>/bin/java[.exe]

    Şimdi beğeninize yeni Süreç API ile ki (mutlak) yolu kullanın. Henüz yeni bir Java 9 API kullanamıyorsanız

    +0

    Bu bir Java 9 API'sı değil mi? Java 8 üzerinde de çalışmak için buna ihtiyacım var (soruya açıklık getirecek). – Nicolai

    +1

    Dooh. '.orElseThrow() ile birlikte kullanıldı, aslında Java 10 ... – Sormuras