Başka classpath
bir JAR dosyasında bulunan bir JAR dosyası içeren bir Java belirtmek mümkün müdür ?
Başka classpath
bir JAR dosyasında bulunan bir JAR dosyası içeren bir Java belirtmek mümkün müdür ?
Yanıtlar:
Uygulamanızı ve gerekli kitaplıklarını içeren tek bir kavanoz oluşturmaya çalışıyorsanız, bunu yapmanın iki yolu vardır (bildiğim). Birincisi , kavanozların yuvalanmasına izin vermek için özel bir sınıf yükleyici kullanan One-Jar . İkincisi, içerilen kütüphaneleri patlatan ve tüm sınıfları üst düzey kavanoza koyan UberJar (veya Shade ).
UberJar ve Shade'nin sırasıyla Maven1 ve Maven2 için eklentiler olduğunu da belirtmeliyim. Aşağıda belirtildiği gibi, montaj eklentisini de kullanabilirsiniz (gerçekte çok daha güçlü, ancak düzgün bir şekilde yapılandırılması çok daha zordur).
Bu "JAR içeriğini patlat" çözümlerini kullanmak istemezsiniz. Kesinlikle bir şeyler görmeyi zorlaştırıyorlar (çünkü her şey aynı seviyede patlıyor). Ayrıca, adlandırma çakışmaları olabilir (insanlar uygun paketleri kullanırsa olmamalıdır, ancak bunu her zaman kontrol edemezsiniz).
İstediğiniz özellik, en önemli 25 Sun RFE'sinden biri : Sun'ın sonsuz bilgeliğinde düşük öncelikli olarak belirlediği RFE 4648386 . Sadece Sun'ın uyanmasını umut edebiliriz ...
Bu arada, karşılaştığım en iyi çözüm (Sun'ın JDK'da kopyalamasını diliyorum) özel sınıf yükleyici JarClassLoader kullanmaktır .
activation.jar
).
Bazı araştırmalardan sonra maven veya herhangi bir 3. taraf uzantısı / programı gerektirmeyen bir yöntem buldum.
Manifest dosyanızda "Class-Path" kullanabilirsiniz.
Örneğin:
Manifest dosyası MANIFEST.MF oluştur
Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass
Tüm sınıflarınızı derleyin ve çalıştırın jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
arşiv oluştur
anlamına gelir f
dosya belirtmek istediğinizi belirtmek
v
için ayrıntılı girdi
m
özel manifest dosyasını geçireceğimiz anlamına gelir
Lib paketini lib paketine eklediğinizden emin olun. Kavanozu normal şekilde çalıştırabilmelisiniz.
dayalı: http://www.ibm.com/developerworks/library/j-5things6/
sınıf yolu hakkında ihtiyacınız olan diğer tüm bilgileri burada bulabilirsiniz
custom_lib.jar
sonra kavanoz artık idam edilemez :(
Zipgroupfileset etiketini kullanın ( dosya kümesi etiketiyle aynı nitelikleri kullanır ); dizindeki tüm dosyaları açar ve yeni arşiv dosyanıza ekler. Daha fazla bilgi: http://ant.apache.org/manual/Tasks/zip.html
Bu bir kavanoz kavanoza sorununu çözmek için çok yararlı bir yol - biliyorum çünkü ne yapacağımı anlamaya çalışırken bu tam StackOverflow soru googled. Ant ile inşa edilmiş bir kavanozunuza bir kavanoz veya kavanoz klasörü paketlemek istiyorsanız, tüm bu sınıf yolu veya üçüncü taraf eklenti şeylerini unutun, yapmanız gereken tek şey (Ant'de):
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
Eğer karınca ile inşa ediyorsanız (Tutulmadan karınca kullanıyorum), sadece karıncaya ekleyerek ekstra kavanoz dosyalarını ekleyebilirsiniz ... Birden fazla kişi tarafından tutulan bir projeniz varsa mutlaka en iyi yöntem değil ama işe yarıyor bir kişi projesi için ve kolaydır.
Örneğin .jar dosyasını oluşturan hedefim şuydu:
<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
<manifest>
<attribute name="Author" value="ntg"/>
................................
<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
</manifest>
</jar>
Bunu yapmak için sadece bir satır ekledim:
<jar ....">
<zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
<manifest>
................................
</manifest>
</jar>
nerede
<property name="external-lib-dir"
value="C:\...\eclipseWorkspace\Filter\external\...\lib" />
dış kavanozlara sahip dir. Ve bu kadar...
Bunu yapmak için özel bir sınıf yükleyici veya bunu destekleyen bir üçüncü taraf kitaplığı oluşturmanız gerekir. En iyi seçeneğiniz kavanozu çalışma zamanından çıkarmak ve bunları sınıfyoluna eklemek (veya zaten sınıf yoluna eklemelerini sağlamak).
Javen derleme eklentisi adı verilen bir eklentiye sahip java sürümlerim için maven kullanıyorum .
Sorduğunuz şeyi yapar, ancak diğer önerilerin bazıları gibi - tüm bağımlı kavanozları patlatıp tek bir kavanoza tekrar birleştirin
Eclpise IDE'niz varsa, sadece JAR'ınızı dışa aktarmanız ve "Gerekli kütüphaneleri oluşturulan JAR'a paketlemeniz" yeterlidir. eclipse, gerekli JAR'ları oluşturulan JAR'a otomatik olarak ekleyecek ve bu JAR'ları otomatik olarak yükleyen bazı eclipse özel sınıf yükleyici üretecektir.
Winstone oldukça iyi http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/ . Ancak karmaşık siteler için değil. Ve bu bir utanç çünkü tek gereken eklentiyi dahil etmek.
Eclipse kullanıyorsanız çok kolay bir yol var.
Projenizi "Çalıştırılabilir" Jar dosyası olarak dışa aktarın (Eclipse içinden proje klasörünü sağ tıklayın, "Dışa aktar ..." seçeneğini seçin). Dışa aktarma ayarlarını yapılandırırken, "Gerekli kitaplıkları oluşturulan Jar'a çıkart" ı seçtiğinizden emin olun. Unutmayın, "Gerekli kütüphaneleri paketle ..." değil " Çıkar ..." seçeneğini belirleyin .
Ayrıca : Dışa aktarma ayarlarınızda bir çalıştırma yapılandırması seçmelisiniz. Böylece, bazı sınıflarda her zaman boş bir main () oluşturabilir ve bunu çalışma yapılandırmanız için kullanabilirsiniz.
Her neyse, zamanın% 100'ünün çalışması garanti edilmez - çünkü içerdiğiniz Jar dosyalarının lisanslarını ve imza dosyalarını kopyalamama hakkında bir şey kontrol ettiğinizden emin olmanızı söyleyen bir açılır mesaj göreceksiniz. Ancak, ben bu yapıyor yıllar ve bir sorunla karşılaştı hiç.
Hepimiz root: \ java kullanmalı ve sürüm kodlu paketlerde çıkış koduna sahip olmamız gerektiği için bir Uber-dir'e ayıklamak benim için çalışıyor. Yani ca.tecreations-1.0.0. İmzalama tamam çünkü kavanozlar indirildikleri yerden bozulmamış. 3. taraf imzaları bozulmamış, c: \ java dizinine ayıklayın. İşte benim proje dir. başlatıcıdan çalıştır java -cp c: \ java Launcher