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"/>
gibi gibi ant target’leri yazılabilir. Ama sonuçta yine de,
ş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.