Tek .Jar Dosyası Olarak Dağıtım Hazırlamak

Referans jar’lar ve native kütüphaneleri (.so, .dll vs.) oluşturduğunuz .JAR paketine nasıl dahil ediyorsunuz?

Normalde jar referanslar (netbeans,ant,eclipse bunu yapıyor) /lib klasörü altına kopyalanır. Native’ler için hazır gelen bir seçenek yok ama:

<property name="natives.dir" value="lib/native/win32-x86/"/>
<target name="win-native" depends="jar"
<copy todir="${dist.jar.dir}">
<fileset dir="${natives.dir}"  includes="*.dll"/>
</copy>
</target>
gibi gibi ant target’leri yazılabilir. Ama sonuçta yine de,
| jarname.jar
| /LIBS
| | 1.jar
| | 2.jar
| | 3.jar
| 4.dll
| 5.dll
| log4j.properties
şeklinde .jar paketimiz dışında oluşmuş bir klasör yapımız olur. Aranızda hiç yarım saat bir programı çalıştırmaya uğraşan, sonuçta sorunun yanlış tanımlanan Classpath (JVM’ye -D switch’i gerekliymiş…) olduğunu bulan oldu mu (Java sucks-1)? Tek bir paket oluşturmayı bu nedenle istiyorum.

Sorun Java Classloader’ın .jar paketleri içerisindeki .jar’lara nasıl ulaşacağını bilmemesi. Classpath’daki referanslar mutlaka .Jar dosyası dışında olmalı (Java sucks-2). Aynı şekilde runtime’da native lib’ler yüklenirken jar paketi içine ulaşamıyoruz(Java sucks-3).

Bunları bu kadar yazdım belki başka çözümler vardır da haber verirsiniz, benim bulduğum çok da mantıklı olmayabilir: One-Jar, Netbeans Wiki - PackagingADistributableJavaApp – OneJar. Program çalıştırılmadan önce referans kütüphanelerini otomatik olarak extract ediyor. Sonrasında siliyor.

Bazı notlar:
“Adding the OneJar Manifest” adımında “Class-Path:” için bütün gerekli .jar’ları listelemenize gerek yok, en azından Netbeans kullanıyorsanız ve /lib altında bulunuyorlarsa sorun olmuyor.

Klasör isimlerini değiştirmeyi unutmayın, ne bileyim başka söyleyecek bir şey aklıma gelmedi.