"Java -cp" ve "java -jar" arasındaki farklar?


118

Bir Java uygulaması çalıştıran arasındaki fark nedir
java -cp CLASSPATHve java -jar JAR_FILE_PATH? Biri Java uygulaması çalıştırmak için diğerine tercih edilir mi? Demek istediğim, bu yöntemlerden hangisi JVM için daha pahalı (makine kaynaklarının kullanımına göre)?

Hangisi JVM'nin uygulamayı çalıştırmaya çalışırken daha fazla iş parçacığı oluşturmasına neden olur?

Yanıtlar:


97

Daha az tuzağa sahip olduğu için ("sınıf yolu cehennemine hoş geldiniz") java uygulamasını başlatmak için ilk sürümü tercih ederim. İkincisi, çalıştırılabilir bir jar dosyası gerektirir ve bu uygulama için sınıf yolu, kavanozun bildirimi içinde tanımlanmalıdır (diğer tüm sınıf yolu bildirimleri sessizce göz ardı edilecektir ...). Yani ikinci sürümde kavanozun içine bakmanız, bildirimi okumanız ve sınıf yolu girişlerinin kavanozun depolandığı yerden geçerli olup olmadığını bulmanız gerekir ... Bu kaçınılabilir.

Her iki sürüm için de herhangi bir performans avantajı veya dezavantajı beklemiyorum. Sadece jvm'ye ana iş parçacığı için hangi sınıfı kullanacağını ve kitaplıkları nerede bulabileceğini söyler.


İpler ne olacak? JVM'nin uygulamayı çalıştırmaya çalışırken ortaya çıkardığı iş parçacığı sayısı açısından aynı mı?
Reza

1
Evet. Her iki sürüm de ana yöntemi bulacak ve bunu tek bir iş parçacığı ile çalıştıracaktır. İlk sürüm, sınıf adını bir argüman olarak aktarır, ikinci sürümde ise jvm bunu ana festivalin içinde bulacaktır.
Andreas Dolk

@Andreas_D Lütfen bu yazıya bir göz atar mısınız , sanırım -cp'yi yanlış bir şekilde kullanıyorum ve hatamı nasıl düzelteceğimi bilmiyorum.
fu DL

60

Bağımsız -cpdeğişkenle, sınıf yolunu, yani programınızın derlenirken veya çalıştırılırken ihtiyaç duyabileceği ek sınıflara veya kitaplıklara yol (lar) sağlarsınız. İle -jar, çalıştırmak istediğiniz yürütülebilir JAR dosyasını belirtin.

İkisini birden belirtemezsiniz. Eğer koşmaya çalışırsan java -cp folder/myexternallibrary.jar -jar myprogram.jaro zaman gerçekten işe yaramaz. Bu JAR için sınıf yolu, bir -cpargüman olarak değil Manifestinde belirtilmelidir .

Bununla ilgili daha fazla bilgiyi burada ve burada bulabilirsiniz .

Not: -cpve -classpatheşanlamlıdır.


Benim endişem kaynaklarla mı ilgili? Kullandıkları kaynaklar arasında bir fark var mı?
Reza

@Hesam -cpve arasındaki performans farklarını soruyorsanız -classpath, hayır, fark yok.
Radu Murzea

1
Hayır! -Cp (veya -classpath) ve -jar arasındaki performans farkını kastetmiştim
Reza

2
@Hesam ile -jarhangi yürütülebilir JAR'ı çalıştırmak istediğinizi belirtin. Bununla birlikte -cp, programınızın gerektirebileceği ek sınıflara / kitaplığa giden yolları belirtin. İkisinin çok farklı amaçları var.
Radu Murzea

@RaduMurzea, Onları birleştirdiğimizde gerçekten işe yaramayacağını ne demek istiyorsun ? Örneğinjava -jar PATH -cp PATH2
Pacerier

18

Kullanırken java -cptam nitelikli ana sınıf adı sağlamanız gerekir, örn.

java -cp com.mycompany.MyMain

java -jar myjar.jarJar dosyanızı kullanırken , klasördeki jar dosyasında bulunan manifest.mf aracılığıyla ana sınıf hakkındaki bilgileri sağlamanız gerekir META-INF:

Main-Class: com.mycompany.MyMain


Lütfen bu yazıya bir göz atın , sanırım -cp'yi yanlış bir şekilde kullanıyorum ve hatamı nasıl düzelteceğimi bilmiyorum.
fu DL

10

java -cp CLASSPATH, sınıf yolundaki tüm kodu belirtmek istiyorsanız gereklidir. Bu, kodda hata ayıklamak için kullanışlıdır.

Jarred çalıştırılabilir format: java -jar JarFileUygulamayı tek bir kısa komutla başlatmak isterseniz kullanılabilir. Bir Sınıf-Yol girişinde boşlukla ayrılmış kavanozları kullanarak MANIFEST'inizde ek bağımlı jar dosyaları belirleyebilirsiniz, örneğin:

Class-Path: mysql.jar infobus.jar acme/beans.jar

Her ikisi de performans açısından karşılaştırılabilir.


Lütfen bu yazıya bir göz atın , sanırım -cp'yi yanlış bir şekilde kullanıyorum ve hatamı nasıl düzelteceğimi bilmiyorum.
fu DL

2

Daha önce belirtildiği gibi, -cp sadece komut satırında jvm'ye ana iş parçacığı için hangi sınıfın kullanılacağını ve kitaplıkları nerede bulabileceğini (sınıf yolunu tanımlayın) söylemek içindir. -Jar'da, sınıf yolu ve ana sınıfın jar dosyası bildiriminde tanımlanmasını bekler. Diğeri, komut satırındaki şeyleri tanımlarken, diğerleri onları jar manifestinde bulmak içindir. Performansta bir fark yoktur. Bunları aynı anda kullanamazsınız, -jar, -cp'yi geçersiz kılar.

-Cp kullansanız bile, yine de bildirim dosyasını kontrol edecektir. Böylece, bazı sınıf yollarını manifest'te ve bazılarını komut satırında tanımlayabilirsiniz. Bu, özellikle yapınızla birlikte sağlamayabileceğiniz veya sağlamak istemeyebileceğiniz bazı 3. taraf jar'larına bağımlı olduğunuzda yararlıdır (örneğin, kurulacağı sistemde zaten bulunmasını beklerseniz). Böylece harici kavanozlar sağlamak için kullanabilirsiniz. Konumu sistemler arasında değişebilir veya hatta farklı sistemlerde farklı bir sürüme sahip olabilir (ancak aynı arayüzlere sahip). Bu şekilde, uygulamayı başka bir sürümle oluşturabilir ve uygulamayı farklı sistemlerde çalıştırırken komut satırındaki sınıf yoluna gerçek 3. taraf bağımlılığını ekleyebilirsiniz.


1

Performans açısından herhangi bir fark olmayacak. Java - cp kullanarak, bir java sınıf dosyasını çalıştırmak için sınıf yolunda gerekli sınıfları ve jar'ları belirleyebiliriz.

Çalıştırılabilir bir jar dosyasıysa. Java -jar komutu kullanıldığında, jvm, jar dosyası içindeki /META-INF/MANIFEST.MF dosyasından çalıştırması gereken sınıfı bulur.

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.