Komut satırından bir JAR dosyası çalıştırın ve sınıf yolunu belirtin


115

Bir JAR dosyası derledim ve manifestte Ana Sınıfı belirledim (Eclipse Export işlevini kullandım). Bağımlılıklarımın tümü etiketli bir dizinde lib. lib/*Sınıf yolu olarak kullanması gerektiğini belirtirken JAR dosyamı nasıl çalıştıracağıma dair net bir yanıt alamıyorum .

Denedim:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

vb...

Her biri bir hata verir:

Error: Could not find or load main class ....

veya NoClassDefFoundErrorkitaplıkların bulunmadığını belirtir.

Hatta JAR dosyasını yeniden oluşturmayı denedim ve libdizini ve içeriğini ekledim, ancak yine de zar yok ...

Komut satırından bir JAR dosyasını nasıl çalıştırabilir ve kullanılacak sınıf yolunu nasıl belirleyebilirim?


Yanıtlar:


204

Bunu -jarbelirlediğinizde -cpparametre yok sayılacaktır.

Gönderen belgeler :

Bu seçeneği kullandığınızda, JAR dosyası tüm kullanıcı sınıflarının kaynağıdır ve diğer kullanıcı sınıfı yolu ayarları yok sayılır.

Ayrıca gerekli jar dosyalarını başka bir jar dosyasına "dahil edemezsiniz" (içeriklerini çıkarmanız ve .class dosyalarını jar dosyanıza koymanız gerekir)

İki seçeneğiniz var:

  1. libdizindeki tüm jar dosyalarını bildirime dahil edin (orada göreli yolları kullanabilirsiniz)
  2. Şunları kullanarak komut satırında her şeyi ( jar'ınız dahil ) belirtin -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; bunun yerine: aşağıdaki gibi pencereleri kullanırsanız java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Hata

Ayrıca gerekli jar dosyalarını başka bir jar dosyasına "dahil edemezsiniz". Tabi ki yapabilirsin. Dahili kullanım içinse (yani, kullanıcının bazı teknik becerilere sahip olmasını beklerseniz), kavanozu çalıştırmadan önce 1. adımın çalıştırılmasını isteyebilirsiniz unzip MyJar.jar lib/*.jar. Sonra, önerdiğiniz gibi koşabilirlerjava -cp MyJar.jar:lib/* ...
Roger

3
bummer, harici bir sunucuya özgü özellikler dosyasına referansla "her şey dahil" bir uber jar çalıştırmak için yaygın bir kullanım durumudur. Açıkçası bir engelleyici değil, ama -jar'ı kullanırsanız ve ana
Andrew Norman

Anlamam biraz zaman aldı. Ve bir log4j dosyasını açıkça yüklemek yaklaşık 6 satır sürer. Asla düzeltilemeyecek başka bir Java hatası.
Tuntable

1
Manifesst Sınıf-Yolunun yalnızca jar dosyalarını yüklemek için kullanılabileceğini unutmayın. Örneğin, log4j3.xml dosyasını aramak için kullanılamaz. Beni iyi anladı.
2019

34

Bir jar dosyası çalıştırın ve şuna benzer bir sınıf yolu belirtin:

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar yürütmek istediğiniz JAR'ın tam adıdır

libs/* bağımlılık JAR'larınıza giden bir yoldur

com.test.Appmain(String[])yöntemi içeren JAR sınıfının tam nitelikli adıdır

Jar ve bağımlı jar, yürütme izinlerine sahip olmalıdır.


10

Bunları unix kabuğunda yapabilirsiniz:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Bunları Windows powershell'de yapabilirsiniz:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

Alternatif olarak, isterseniz sınıf yolunu ve ana sınıfı belirtmek için manifest'i kullanın, böylece -cpana sınıfı kullanmanız veya belirtmeniz gerekmez . Sizin durumunuzda aşağıdaki gibi satırlar olacaktır:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

Maalesef, manifestteki her bir kavanozu hecelemeniz gerekiyor (sadece bir kez yaptığınız gibi çok önemli değil ve dosyayı oluşturmak için bir komut dosyası veya ANT veya Maven veya Gradle gibi bir oluşturma aracı kullanabilirsiniz). Ve başvuru java -jar MyJar.jar,.

Sonra onu çalıştırın

java -jar MyJar.jar

Sınıf-Yolunun dış kavanozdaki dosyalara başvurması gerektiğini düşünüyorum. Bunun genel olarak MyJar.jar dışındaki yapılandırma dosyalarına başvurmak için çalışmasını sağlayamadım.
Tuntable

0

Değiştirgeler içeren sınıf yolu dahil jar'i yeniden başlatmak için bir Runtime.getRuntime.exec (komut) yapabilirsiniz.

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.