Java sınıfyolu içindeki bir dizindeki tüm kavanozları dahil etme


1018

Sınıf yolundaki bir dizine tüm jar dosyalarını dahil etmenin bir yolu var mı?

Deniyorum java -classpath lib/*.jar:. my.package.Programve kesinlikle bu kavanozlarda olan sınıf dosyalarını bulmak mümkün değil. Her jar dosyasını sınıfyoluna ayrı ayrı eklemem gerekir mi?


3
Üzgünüm bunu hiç kabul etmedim. Bir topluluk wiki'si olmalı. Asla verilen cevaplardan birini kullanmadım. Ben sadece lib / dizini tarayan ve dosya adlarını ayrıştırma sınıf yolunu oluşturulan bir kabuk komut dosyası oluşturdu inanıyorum.
Chris Serra

Bu yeni Java özelliğinde bir tür hata var, çünkü açıklandığı gibi çalışmıyor. Cevaplardan birinde anlatıldığı gibi Ant'den vazgeçtim ve onun etrafında çalışmak için kullandım.
Alex R


1
Windows'da joker karakter işlemeyle ilgili bir sorun var. stackoverflow.com/questions/11607873/…
Mykhaylo Adamovych

6
Kısa cevap: (1) .jarparçayı bırakın , (2) en az 2 parçaya; sahip olmalı ve Windows'ta (genellikle :başka bir yerde) ile ayrılmış olmalıdır . Örneğin:java -classpath ".;lib/*" Program
Evgeni Sergeev

Yanıtlar:


1159

Java 6 veya üstünü kullanan sınıf yolu seçeneği joker karakterleri destekler. Aşağıdakilere dikkat et:

  • Düz tırnak işaretleri kullanın ( ")
  • Kullan *, değil*.jar

pencereler

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

Bu Windows'a benzer, ancak :yerine kullanır ;. Joker karakterler kullanamıyorsanız bash, aşağıdaki sözdizimine izin verir ( libtüm Java arşiv dosyalarını içeren dizin nerede ):

java -cp $(echo lib/*.jar | tr ' ' ':')

(Sınıf yolu kullanmanın -jarseçenekle uyumsuz olduğunu unutmayın . Ayrıca bkz: Komut isteminden jar dosyasını birden çok sınıf yolu kitaplığıyla yürütme )

Joker Karakterleri Anlama

Gönderen Sınıf yolu belgede:

Sınıf yolu girişleri basename joker karakter içerebilir *uzantılı dizindeki dosyaların hepsi bir listesini belirterek eşdeğer olarak kabul edilir, .jarya da .JAR. Örneğin, sınıf yolu girdisi foo/*foo adlı dizindeki tüm JAR dosyalarını belirtir. *Geçerli dizindeki tüm jar dosyalarının bir listesine genişleyen bir sınıf yolu girdisi .

İçeren bir sınıf yolu girdisi *sınıf dosyalarıyla eşleşmiyor. Sınıfları ve JAR dosyalarını tek bir dizin foo ile eşleştirmek için foo;foo/*veya tuşlarından birini kullanın foo/*;foo. Seçilen sıra, içindeki sınıfların ve kaynakların fooJAR dosyalarından önce mi yükleneceğini fooyoksa tersi mi yükleneceğini belirler .

Alt dizinler özyinelemeli olarak aranmaz. Örneğin, foo/*sadece JAR dosyaları arar foo, değil foo/bar, foo/bazvs.

Bir dizindeki JAR dosyalarının genişletilmiş sınıf yolunda numaralandırılma sırası belirtilmez ve platformdan platforma ve hatta aynı makinede zaman zaman değişebilir. İyi yapılandırılmış bir uygulama belirli bir düzene bağlı olmamalıdır. Belirli bir sipariş gerekiyorsa, JAR dosyaları sınıf yolunda açıkça numaralandırılabilir.

Joker karakterlerin genişletilmesi, bir programın ana yönteminin çağrılmasından önce, sınıf yükleme işlemi sırasında geç olmaktan ziyade, erken yapılır. Joker karakter içeren giriş sınıfı yolunun her öğesinin yerine, belirtilen dizindeki JAR dosyaları numaralandırılarak oluşturulan (muhtemelen boş) öğe dizisi gelir. Örneğin, dizin , ve fooiçeriyorsa a.jar, sınıf yolu içine genişletilir ve bu dize system özelliğinin değeri olur .b.jarc.jarfoo/*foo/a.jar;foo/b.jar;foo/c.jarjava.class.path

CLASSPATHDeğişkeni herhangi bir farklı tedavi değildir -classpath(ya da -cp) komut satırı seçeneği. Yani, tüm bu durumlarda joker karakterler onurlandırılır. Ancak, sınıf yolu joker karakterleri Class-Path jar-manifestbaşlıkta onurlandırılmaz .

Not: java 8'deki bilinen bir hata nedeniyle, Windows örneklerinde sondaki yıldız işaretli bir ters eğik çizgi kullanılmalıdır: https://bugs.openjdk.java.net/browse/JDK-8131329


2
Özellik iyi belgelenmemiştir ve amaçlandığı gibi çalışmak için belli olandan daha az ön koşulların yerine getirilmesi gerekmektedir.
Alex R

1
Son bash / tr numarası için +1. Java / JamVM burada çalışma dizini dışındaki yollar için joker karakterlerden hoşlanmaz, ancak kabuk joker + trworks kullanarak her JAR'a açıkça atıfta bulunur !
Supr

1
Ben java -classpath /jars/*:/anotherJarsDir/* com.test.MyClasstırnak olmadan bir komut var ve iyi çalışıyor. Kabuğun neden onu genişletmediğini ve hata yapmadığını merak ediyorum?
yellavon

3
Ayrıca ~-cp'de de kullanmayın
Sohail Si

1
Windows örneğiniz java 8 veya daha önceki sürümlerle çalışmaz, ancak şu sınıfyoluyla çalışır: Test.jar; lib \ * ... eğik çizgi, bir yıldız işareti ve birkaç diğer öğeden önceki durumlar dışında iyidir ... bkz. Bugs.openjdk. java.net/browse/JDK-8131329
philwalk

226

Pencerelerin altında bu çalışır:

java -cp "Test.jar;lib/*" my.package.MainClass

ve bu çalışmaz:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

* .jar öğesine dikkat edin, böylece * joker karakteri tek başına kullanılmalıdır .


Linux'ta aşağıdakiler çalışır:

java -cp "Test.jar:lib/*" my.package.MainClass

Ayırıcılar noktalı virgül yerine iki nokta üst üste işaretidir.


17
Mükemmel cevap.
Dikkat

4
Bir yıl 8 ay sonra, UNIX sürümünü eklemek için yaptığım düzenleme beni bir kez daha kurtardı. :) Komik benim jar dosyaları ile nasıl tanıyamazdı *.jarama sadece ile *.
jmort253

Sınıfyollarının sırasının önemli olduğunu gördüm (ama nedenini bilmiyorum). Sınıf yollarının sırasını değiştirene kadar hata alıyordum.
Kullanıcı13107

@ jmort253, şey şu, bu kabuk * genişlemiyor, ama joker karakter sınıf yolunu ayrıştırıyor, * karakterini görüyor ve joker karakteri dolduruyor
Sebastian

1
@SebastianGodelet - Yeh, Regex joker karakterleri ve bu gösterim arasında kafam karıştı. Çoğunlukla, beni kurtaran şey, :bir platformda ve diğerinde arasındaki farkı bilmek ;. :) Java ile yılda yaklaşık bir kez derliyorum, ne kadar sık ​​sık sinir bozucu olduğumu hatırlamıyorum.
jmort253

67

Bu sorunu, gerekli diğer kavanozlarla bir sınıf yolu belirten bir manifest ( ) dosyası içeren bir ana kavanoz dosyası dağıtarak , daha sonra onun yanında dağıtılarak çözüyoruz. Bu durumda, yalnızca kodu çalıştırırken bildirmeniz gerekir .myapp.jarManifest.mfjava -jar myapp.jar

Bu nedenle, main'i bir jardizine dağıtır ve ardından bağımlı kavanozları bunun libaltındaki bir klasöre koyarsanız , bildirim şöyle görünür:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

Not: bu platformdan bağımsızdır - bir UNIX sunucusunda veya bir Windows PC'de başlatmak için aynı kavanozları kullanabiliriz.


Bu birçok insan için işe yarıyor gibi görünse de, Java burada manifest dosyasındaki Class-Path girişlerini açıkça görmezden geliyor gibi görünüyor. -Cp kullanarak sınıf yoluna el ile "lib / *" eklemeden uygulamayı çalıştıramayız. Herhangi bir fikir?
Raku

6
oxbow_lakes'in cevabı tamamen doğru değil; java -jar myapp.jar ile bu kavanoza başlatırsanız Class-Path olayı onurlandırılır (ve SADECE onurlandırılır; -cp / -classpath yoksayılır!). Ben oxbow_lakes 'java -classpath myapp.jar' yazdığında yazmak anlamına geliyordu.
rzwitserloot

47

"Lib" dizinindeki tüm kavanozlara sahip java-sun 1.6.0_24 kullanarak Ubuntu 10.04 üzerinde benim çözüm:

java -cp.: lib / * alanım.Kategori

Bu başarısız olursa, aşağıdaki komut çalışmalıdır (lib dizinindeki tüm * .jar dosyalarını classpath parametresine yazdırır)

java -cp $ (lib / *. jar içindeki i için; echo -n $ i:; done). my.main.Class

4
komik bir not. java -cp lib / * my.main.Class lib / * öğesinin kabuk glob genişlemesi nedeniyle her zaman başarısız olurken, java -cp: lib / * my.main.Class geçerli değildir.: lib / * geçerli bir glob değil yolu. Bunu not etmek için biraz zaman ayırın
albfan

1
Bu çalışmıyor; linux genişleyecek . deneyebilirsiniz: java -cp '.: lib / ' ve bu iyi çalışıyor (tek tırnaklara dikkat edin! Çift tırnaklarla çalışmaz!). Aslında,.: Lib / *, kolon nedeniyle yasal bir dünya değilse işe yarayabilir, ancak biraz havalı hisseder. Alıntıları eklerdim. Tek tırnaklar bash'a içeriğin hiçbir bölümüne dokunmamasını söyler.
rzwitserloot

Tek veya çift tırnak kullanırsanız (bu bağlamda) önemli değil. Kabuğun * genişlemesini (globbing) önlemek istiyorsunuz, hepsi bu. Ve "lib / *" metnini kelimenin tam anlamıyla JVM'ye iletin, böylece VM bunu bir "özel model" olarak tanır ve kendi başına jar dosyalarını arar.
Angel O'Sphere

36

Kısa cevap: java -classpath lib/*:. my.package.Program

Oracle, sınıf yolu joker karakterlerini anlama başlığı altında, burada Java 6 ve Java 7 için sınıf yollarında joker karakterler kullanma hakkında belgeler sağlar . (Bunu yazarken, iki sayfa aynı bilgileri içerir.) İşte önemli noktaların bir özeti:

  • Genel olarak, belirli bir dizindeki tüm JAR'ları dahil etmek için joker karakteri kullanabilirsiniz *( değil *.jar ).

  • Joker karakter yalnızca JAR'lerle eşleşir, sınıf dosyalarıyla eşleşmez; bir dizindeki tüm sınıfları almak için, dizin adındaki sınıf yolu girişini sonlandırmanız yeterlidir.

  • Yukarıdaki iki seçenek bir dizindeki tüm JAR ve sınıf dosyalarını içerecek şekilde birleştirilebilir ve normal sınıf yolu öncelik kuralları geçerlidir. Örneğin-cp /classes;/jars/*

  • Joker olacak değil altdizinlere kavanozları arayın.

  • CLASSPATHSystem özelliğini veya -cpveya -classpathkomut satırı bayraklarını kullanırsanız yukarıdaki madde işaretleri doğrudur . Kullanmak Ancak, Class-Path(eğer bir karınca yapı dosyası ile yapabilir gibi) JAR tezahür başlığını joker olacak değil onur.

Evet, ilk bağlantım en yüksek puanlı cevapta verilenle aynıdır (sollama umudum yoktur), ancak bu cevap bağlantının ötesinde çok fazla açıklama sağlamaz. Bu günlerde Stack Overflow'da bu tür bir davranıştan vazgeçildiği için , onu genişleteceğimi düşündüm.


benim sorunum lib / * yerine lib / *. Çok teşekkürler bu düzeltildi. Fark ettim: ve; ama bu benim aynı zamanda birçok değişikliği test etmem olabilir.
Eyad Ebrahim

* Ve * .jar
burakhan alkan

36

Windows :

 java -cp file.jar;dir/* my.app.ClassName

Linux :

 java -cp file.jar:dir/* my.app.ClassName

Hatırlatmak:
- Windows yol ayırıcı ;
- Linux yol ayırıcı :
- Windows cp argümanı boşluk içermiyorsa, "tırnak" isteğe bağlıdır


windows örneği java 8 ve öncesi için çalışmıyor: bkz. bugs.openjdk.java.net/browse/JDK-8131329
philwalk

Belki açık JDK için işe yaramaz, bunu test edeceğim ve burada konuşacağım
Wender

Maalesef HotSpot ile test yaptım ve bunun openjdk ile çalıştığını düşündüm.
Wender

Windows altındaki Oracle java, eğik çizgi yerine yıldız işaretinden önce ters eğik çizgi gerektirir, ancak en yeni veya alternatif java sürümlerini yeniden test etmedim.
philwalk

macos üzerinde çalışmıyor
Greyshack


29

Java'yı http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html deneyebilirsiniz-Djava.ext.dirs=jarDirectory

Java çalıştırırken harici kavanozlar dizini


3
Bu çalışıyor, ama dikkat -Djava.ext.dirs=etmeden ÖNCE-jar
Giovanni Funchal

5
java.ext.dirs sınıf yolundaki normal bir kavanozdan çok farklı çalışacaktır. Bootstamp'taki sınıfları bir şekilde geçersiz kılabilecek daha yüksek önceliğe ve izne sahip (rt.jar)
Dennis C

Teşekkürler. 'Java sürümü "1.8.0_221" Java (TM) SE Çalışma Zamanı Ortamı'nda (derleme 1.8.0_221-b27) Java HotSpot (TM) 64 Bit Sunucu VM (yapı 25.221-b27, karışık mod)', yalnızca bu -D sürümü sınıf yolundan geçme işe yaradı. Geleneksel biçim yoktu.
Matt Campbell

23

Doğru :

java -classpath "lib/*:." my.package.Program

Yanlış:

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

9

Tüm .jar dosyalarını gerçekten dinamik olarak belirtmeniz gerekiyorsa, kabuk komut dosyalarını veya Apache Ant'i kullanabilirsiniz . Commons Launcher adında , başlangıç ​​komut dosyanızı bir ant derleme dosyası olarak belirtmenizi sağlayan bir ortak proje var (ne demek istediğimi görürseniz).

Ardından, aşağıdaki gibi bir şey belirtebilirsiniz:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

Uygulamanızı doğru sınıfyoluyla başlatacak olan başlatma dosyanızda.



8

Windows'ta Java 7 için joker karakter genişletmenin bozulduğunu lütfen unutmayın.

Daha fazla bilgi için bu StackOverflow sorununa göz atın .

Çözüm, joker karakterden hemen sonra noktalı virgül koymaktır. java -cp "somewhere/*;"


6

İlgili makama,

Bu garip davranışı MSYS / MinGW kabuğu altında Windows'ta buldum.

İşler:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

Çalışmıyor:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

Joker karakterin kabuk tarafından genişletilmediğinden eminim çünkü

$ echo './*'
./*

( echoAynı sonuçla, yerleşik değil, başka bir programla da denedim .)

Onu javacgenişletmeye çalıştığına inanıyorum ve argümanda noktalı virgül olup olmadığı farklı davranıyor. Birincisi, yollara benzeyen tüm argümanları genişletmeye çalışıyor olabilir. Ve ancak o zaman -cpsadece aşağıdaki jetonu alarak onları ayrıştırırdı . ( com.comsol.aco_1.0.0.jarBu dizindeki ikinci JAR olduğuna dikkat edin.) Bu bir tahmindir.

Bu

$ javac -version
javac 1.7.0

5

Java uygulamasını Eclipse veya Netbeans gibi herhangi bir IDE dışında geliştirir ve çalıştırırsanız yukarıdaki tüm çözümler harika çalışır.

Windows 7 üzerindeyseniz ve Java'da Geliştirme için Eclipse IDE kullandıysanız, Eclipse içinde oluşturulan sınıf dosyalarını çalıştırmak için Komut İstemi'ni kullanıyorsanız sorun yaşayabilirsiniz.

Eclipse içindeki kaynak kodunuz şu paket hiyerarşisine sahip: edu.sjsu.myapp.Main.java

Main.java için harici bir bağımlılık olarak json.jar var

Main.java'yı Eclipse içinden çalıştırmayı denediğinizde, herhangi bir sorun olmadan çalışır.

Ancak Eclipse içinde Main.java derledikten sonra Komut İstemi'ni kullanarak bunu çalıştırmayı denediğinizde, "ClassNotDef Error blah blah" diyerek bazı garip hatalar çekecektir.

Kaynak kodunuzun çalışma dizininde olduğunuzu varsayıyorum !!

Komut isteminden çalıştırmak için aşağıdaki sözdizimini kullanın:

  1. javac -cp ".; json.jar" Main.java

  2. java -cp ".; json.jar" edu.sjsu.myapp.Main

    [Kaçırmayın. yukarıda]

Bunun nedeni, Main.java'yı edu.sjsu.myapp paketinin içine yerleştirmiş olmanızdır ve java.exe tam deseni arayacaktır.

Umarım yardımcı olur !!


4

Windows için tırnak işaretleri gereklidir ve; ayırıcı olarak kullanılmalıdır. Örneğin:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

Kısa Form: Ana alanınız bir kavanozun içindeyse, muhtemelen ('YourJarsName.jar' sınıf yolunda olsa da) açıkça çalışmak için bildirilen ek bir '-jar pathTo / yourJar / YourJarsName.jar' gerekir. , 5 yıl önce sorulan orijinal soruyu cevaplamak için ifade edildi: her bir kavanozu açıkça yeniden tanımlamanız gerekmez, ancak java6 ile bile kendi kavanozunuzu yeniden tanımlamanız gerekir ...)


Uzun Form: (Bunu java'ya müdahale edenlerin bile bundan yararlanabileceğini umduğum bir noktaya getirdim)

Burada birçokları gibi kavanozları dışa aktarmak için eclipse kullanıyorum: (Dosya-> Dışa Aktar -> 'Çalıştırılabilir JAR Dosyası'). 'Kütüphane kullanımı' tutulma (Juno) teklifleri için üç seçenek vardır:

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

Tipik olarak ben opt2 kullanmak istiyorsunuz (ve opt1 kesinlikle kırıyordu), ancak kullandığım kavanozlardan birinde yerel kod, bu seçeneği seçtiğinizde tutulma kaldıraçları kullanışlı "jarinjar" hile ile keşfetti. Opt3'e ihtiyacım olduğunu fark ettikten ve hatta bu StackOverflow girişini bulduktan sonra bile, ana tutucumun dışını nasıl açacağımı anlamaya çalışmak biraz zaman aldı, bu yüzden başkaları için yararlı olduğu için benim için işe yarayan şey ...


Jar'nizi adlandırdıysanız: "fooBarTheJarFile.jar" ve tümü dir: "/ theFully / qualPath / toYourChosenDir" dizinine aktarılacak şekilde ayarlanmışsa.

('Hedefi dışa aktar' alanı şu anlama gelir: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

Finish tuşuna bastıktan sonra, eclipse yazdıktan sonra tüm kütüphaneleri bu dışa aktarma dizininde 'fooBarTheJarFile_lib' adlı bir klasöre koyar ve size şöyle bir şey verir:

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

Daha sonra sisteminizdeki herhangi bir yerden aşağıdakilerle başlatabilirsiniz:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(Java Newbies için: 'package.path_to.the_class_with.your_main', 'main (String [] argümanlarını) içeren' TheClassWithYourMain.java 'dosyasının üstünde bulacağınız bildirilen paket yoludur. .} 'java dışından çalıştırmak istediğiniz)


Dikkat edilmesi gereken bir tuzak: beyan edilen sınıf yolunuzdaki kavanozlar listesinde 'fooBarTheJarFile.jar' olması yeterli değildir. Açıkça '-jar' bildirmeniz ve bu kavanozun yerini yeniden bildirmeniz gerekir.

örneğin, bu kesiliyor:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

göreli yollarla yeniden ifade edildi:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(Java sürümü "1.6.0_27" kullanarak; Ubuntu 12.04'te OpenJDK 64-Bit Sunucu VM ile)


3

Bunu nasıl yapacağımı bilmemin tek yolu, örneğin:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

Umarım yardımcı olur!


Bu '08'de tek yol olabilirdi, ama artık değil.
simo.3792

Bu en kötü şey değil. Bu bir hack, ama benim bashrc bu set varfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

wepapp sınıfı:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

Hepsini ayrı ayrı eklemeniz gerekir. Alternatif olarak, gerçekten sadece bir dizin belirtmeniz gerekiyorsa, her şeyi tek bir direkte açıp sınıf yolunuza ekleyebilirsiniz. Ancak bu yaklaşımı önermiyorum çünkü sınıf yolu versiyonlaması ve yönetilememesi gibi tuhaf problemler riskiniz var.


3
Bu '08'de tek yol olabilirdi, ama artık değil.
simo.3792

2

/ C-to / cp ayarlamak için doğrudan bir çözüm değil ama umarım dinamik sınıf yolları ve lib dizinleri için durumu biraz kolaylaştırmak için aşağıdaki komut dosyası kullanabilirsiniz.

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

Linux için yazılmış, windows için de benzer bir senaryoya sahip olabilir. "LibDir2Scan4jars" dosyasına girdi olarak uygun dizin sağlanmışsa; komut dosyası tüm kavanozları tarar ve bir sınıfyolu dizesi oluşturur ve bunu "tmpCLASSPATH" env değişkenine verir.


2

macOS, geçerli klasör

MacOS Mojave'deki Java 13 için …

Tüm .jardosyalarınız aynı klasördeyse, geçerli çalışma dizininizicd yapmak için kullanın . İle doğrulayınpwd .

Bunun için öncelikle uygulamanızın JAR dosyasını-classpath listelemeniz gerekir . Sınırlayıcı olarak iki nokta üst üste karakteri kullanarak , aynı klasördeki diğer tüm JAR dosyalarını almak için yıldız işareti ekleyin . Son olarak, sınıfınızın tam paket adını yönteminizle iletin .:*main

Örneğin, adlı bir JAR dosyasında bir uygulama için my_app.jarbir ile mainadında bir sınıfta yöntemle Appadında bir pakette com.exampleaynı klasörde bazı gerekli kavanoz yanında,:

java -classpath my_app.jar:* com.example.App

java 8 için çalışmıyor
Greyshack

1

Bir jar dosyasını bir dizin yapısının kökü olarak düşünün. Evet, hepsini ayrı ayrı eklemeniz gerekiyor.


1

Sınıfyolunu uygun çoklu kavanozlara ve geçerli dizinin sınıf dosyalarına göre ayarlayın.

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

Bir klasörde birden fazla kavanoz var. Aşağıdaki komut benim için çalıştıJDK1.8 , klasörde bulunan tüm kavanozları dahil etmek . Sınıf yolunda bir boşluğunuz varsa tırnak içine almayı unutmayın

pencereler

Derleme: javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

Koşu: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

Linux

Derleme: javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

Koşu: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram


-1

Java dosyasını jar veya Ubuntu'da sınıf olarak çalıştırmaya çalışıyorum. Her iki seçenekte de başarısız oldum. Aşağıdaki istisna çıktıdır.

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetrik

veya

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

veya

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrikler

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

Cevabı buldum:

Aptallığım.

İlk adım: İlgili Java'yı ayarlamanız gerekir: Java 11 kullanıyordum ancak 8. sürümde Java lib yolu olarak ayarladım! - Java sürümünü buradan ayarlayabilirsiniz:

  sudo update-alternatives --config java

2. adım: Ardından yolu ve dosya adlarını karşılık gelen yol ve dosyalarınızla değiştirerek aşağıdaki komutu çalıştırın:

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

Başarıyla çalıştırıldı!

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.