Bir uygulamayı belirli bir Java sürümünü kullanmaya nasıl yönlendirirsiniz?


3

Bir Java uygulaması var yok ben doğrudan JAR başlattığınızda sorunsuz Java 1.8 altında çalıştırın. Ancak Mac'imde JAR, Java 1.6'yı yüklememi isteyen bir uygulamanın içine sarılıyor - ki bunu yapmak istemiyorum!

Bu yüzden, uygulamamın yüklü Java 1.8 kullanmasını sağlayacak şekilde yapılandırabileceğim uygulama paketindeki noktayı araştırıyorum

Özelliğin değiştirilmesi InfoDictionary versioniçinde Contents/Info.plist8.0'a yardımcı olmayacaktır.

Bu mümkün mü yoksa tamamen yeni bir Uygulama Paketi oluşturmam gerekiyor mu? Daha sonra, bir grup uygulama için bunu yapmak için en iyi araç hangisidir?


Uygulama kendi başına bir Java uygulaması mı, yoksa başka bir uygulamada Tom olarak mı adlandırılıyor? Kendi başına bir Java uygulamasıysa, kendisine belirli bir Java sürümünü işaret edebilirsiniz, aksi takdirde o uygulamayı açmak istediğinizde genel bir Java sürümü belirtmeniz gerekir.
agentroadkill

@ agentroadkill: Aslına bakılırsa, diğer tüm platformlarda JAR dosyası olarak dağıtılan kendi uygulamasıdır. MacOS için bir APP paketi içinde paketlenmiştir. İçinde "paket içeriğini göster" i seçerseniz, bazı meta verileri, Info.plist ve JAR 'ı bulacaksınız. Bu JAR'ı direkt olarak başlatabilirim.
Yedi

@ agentroadkill: Peki, lütfen Java sürümümü tüm uygulamalara nasıl belirleyeceğimi biraz açıklayabilir misiniz?
Yedi

İşte aradığınızı belirten SuperUser yayını. Aşağıda bir cevapta daha ayrıntılı olarak çalışacağım.
agentroadkill

Bence bu cevap bu konuyu tamamlayabilir: stackoverflow.com/a/15379462/335478
Seven

Yanıtlar:


3

Bu, atlama bulmaya bir cevap bulmaya yardımcı olabilir. PyCharm.app 'in benzer bir şey yaptığını hatırlatarak, işte uygulamalar Info.plistdosyasından bir alıntı (oradaki… snip… satırlarını izleyin):

…snip…
<key>JVMOptions</key>
<dict>
  …snip…
  <key>JVMVersion</key>
  <!-- string>1.6*,1.7+</string -->
  <string>1.7+</string>
  …snip…
</dict>
…snip…

Ayrıca, PaperCut Client uygulaması (PCClient), içindeki bazı simliar öğelerini kullanır Info.plist:

<plist version="1.0">
  <dict>
    …snip…
    <key>CFBundleExecutable</key>
    <string>JavaAppLauncher</string>
    <key>JVMRuntime</key>
    <string>jre</string>
    <key>JVMMainClassName</key>
    <string>biz.papercut.pcng.client.uit.UserClient</string>
    <key>JVMOptions</key>
    <array>
      <string>-Dclient.home=$APP_ROOT/Contents/Resources/</string>
      <string>-Dcom.apple.macos.useScreenMenuBar=true</string>
      <string>-Xmx256m</string>
      <!-- Workaround since the icon parameter for bundleapp doesn't work -->
      <string>-Xdock:icon=$APP_ROOT/Contents/Resources/client-icon.icns</string>
    </array>
    <key>JVMArguments</key>
    <array/>
  </dict>
</plist>

Yine, bunlar farklı Info.plistdosyaların parçalarıdır, bu nedenle düz kopyala ve yapıştır olarak çalışmayabilirler. Ancak, her iki uygulama da OS X üzerinde çalışır , bu nedenle bu anahtarlar / değerler çalışan bir çözüme daralmanıza yardımcı olabilir.

Her iki uygulamanın da işleri yapmanın biraz farklı bir yolu olduğu görülüyor. PCClient.app kendi Java sürümünü içeriyor gibi gözükse de, PyCharm OS X'te yüklü olana güveniyor.


Teşekkürler, tam da istediğim minimum JRE'yi söyleyebilmem gerektiğini düşündüğüm yer burasıydı ... Ancak, bu ayarların hiçbirinin bir etkisi olmadı. Hala JRE 1.6'yı kurmak isteyen bir iletişim kutusu alıyorum. Ayrıca, aslında başlatılan JavaAppLauncher'a bağlı olduğunu düşünüyorum, bu da JRE 1.6
Seven

3

Görünüşe göre Oracle bunu düzeltebilirdi. Ama yapmadım ...

Bu yüzden şimdi bunu yaparken çalışmasını sağladım: (Tüm krediler: https://oliverdowling.com.au/2014/03/28/java-se-8-on-mac-os-x )

En son JDK’yı kurduğunuzu farz ediyorum (şu anda 1.8.0_60, lütfen bunu daha sonra ayarlayınız)

Info.plist'in içeriğini değiştir:

Terminal'i açın ve bu komutu verin

sudo nano /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Info.plist

Anahtarı arayın JVMCapabilitiesve bunu şu şekilde değiştirin:

<key>JVMCapabilities</key>
<array>
    <string>CommandLine</string>
    <string>JNI</string>
    <string>BundledApp</string>
</array>

Bir sembolik için ekleyin libjvm.dylibve libserver.dylib:

Terminal'i açın ve şu iki komutu verin:

sudo mkdir -p /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bundle/Libraries
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bundle/Libraries/libserver.dylib

1
Bu chnage ne yapar?
Mark,

@Mark Bu değişiklik JVM'nin yalnızca komut satırından değil, Java Yerel Arabirimi ve birlikte gelen uygulamalardan da çalıştırılmasını sağlar. Ancak, yine de bulmak mümkün olmayacaktır bulabilirsiniz libjvm.dylibve libserver.dylibhangi sembolik bağları sabittir.
spex

bu harika bir cevap ama bunu JDK yerine JRE'ye nasıl uygularsınız? Altındaki eşleştirme için eşdeğerini buldum /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/ancak JVMCapabilitiesgiriş içeren bir Info.plist yok .
tatsu

1

SuperUser'da yayınlanan bir yazı sayesinde bu oldukça basit görünüyor. Görünüşe göre farklı Java sürümleri Apple'ın kendi JRE'sinden çağrılabilir:

/usr/libexec/java_home -v 1.6.0 --exec <Java command>

Anladığım kadarıyla, bunun aslında farklı bir JRE sağlaması değil, yalnızca kurulu JRE'nin kendisini çağrılan sürüm olarak tanımlamasına neden oluyor ve sürümler arasında küçük farklar yaratıyor. Durum böyle değilse, diğerleri beni kesinlikle düzeltmelidir.

Amaçlarınız için bu

/usr/libexec/java_home -v 1.6.0 --exec java -jar <yourJarHere>.jar

Yukarıdaki bağlantılı gönderi ayrıca doğru komutu kullanmak için /Applications/yourApp.app/Contents/MacOS/yourApp adlı dosyayı düzenleyebildiğinizi ve böylece her seferinde yeniden yazmanıza ya da hatırlamanıza gerek olmadığını gösterir.

Bütün bu nezaket Geff


Tek yaptığı, -v parametresi ile tanımlanan java'yı çalıştırmak
Mark

Sağ mesele, uygulamanın JRE'nin farklı bir versiyonunu istemesiydi. Bu, Apple tarafından tedarik edilen JRE'nin kendisini gerekli biri olarak tanımlamasına neden olur ve bu Java sürümünün beklenen işlevlerini sağlar
agentroadkill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.