Çalıştırılabilir JAR dosyası oluşturma (Executable Jar)

Java projenizi yazdınız, ancak bu Java projenizi bir uygulama şeklinde nasıl sunacağınız konusunda ikileme düştünüz. Bunu yapmak için 3 yöntem var. Eğer bir web sunucunuz varsa bu uygulamanızı Applet veya JWS uygulaması olarak sunabilirsiniz, ancak böyle bir sunucunuz yoksa bunu Java Archive File (JAR) olarak sunmanız gerecektir. Kullanacak olan kişinin sınıf dosyalarıyla uğraşmadan dosyaya tıklayarak çalıştırmasını istiyorsanız çalıştırılabilir bir JAR oluşturmanız gerekecektir.

Bu işin iki yöntemi var. Ben Eclipse kullanan biri olduğum için bu çalıştırılabilir JAR oluşturma işini Eclipse'te export yardımıyla yapıyorum.

1. Projeye sağ tıklıyoruz
2. Export'a tıklıyoruz
3. Runnable JAR File seçiyoruz
4. Yeni ekranda oluşacak jar için konum bilgisi giriyoruz. Launch Configuration seçeneği altında çalışacak olan ana sınıfı seçiyoruz. Eğer kullandığımız kütüphaneler varsa Package required libraries into generated JAR seçeneğini seçmeyi unutmuyoruz. (Bkz. yukarıdaki resim)
7. Finish ile sonlandırıp jarımızı oluşturuyoruz.

Diğer yöntem komut satırından bu işi yapmaktır. Ve kullanıcıya bu oluşan JAR'ı sunmaktır. Aşama aşama şu şekilde yapılmaktadır.

1. Kaynak dosyalarını derliyoruz (javac -classpath . net/kodveus/jws/*.java)
2. Manifesto dosyasını oluşturuyoruz
İçeriği:
Manifest-Version: 1.0 Sealed: true
Main-Class: net.kodveus.jws.NotDefteri
3. Daha sonra JAR dosyasını, hazırladığımız manifesto dosyasıyla birlikte oluşturuyoruz (jar cvmf MANIFEST.MF NotDefteri.jar net)

Eğer kaynak kodların JAR dosyasında olmamasını istiyorsak 3. komutu çalıştırmadan önce .java uzantılı dosyaların hepsini siliyoruz.

Bütün bu aşamalar başarılı bir şekilde yapılırsa aşağıdaki ekrandaki gibi birşeyler görmeniz gerekiyor. (MANIFEST.MF dosyasını copy con komutu yerine Notepad ile de oluşturup ilgili dizine atabilirsiniz)

JAR dosyamızı oluşturduk. Peki bu jar dosyası nasıl çalışacak?

Eğer kullanıcı bu dosyayı başka bir araçla (örneğin winrar) açmaya ayarlamamış ise yapması gereken bu jar dosyasına çift tıklamaktan ibarettir. Ancak siz buna güvenemem derseniz o zaman bu dosya ile birlikte bir bat dosyası (veya linux için sh dosyası) vermelisiniz. O dosyanın içeriği şu şekilde tek satırlık bir şey olacaktır:

java -jar NotDefteri.jar

Peki herşey bu kadar kolay mı? Hayır değil. Eğer kullanıcı java.exe'nin bulunduğu dizini (Java ev dizini - JAVA_HOME diye geçer çoğu kaynakta :-) ) path'e eklememişse bu komutu çalıştırmadan önce eklemesi gerekiyor. Bunu nasıl mı yapacak? Windows için:

1. Bilgisayarım'a sağ tıklıyoruz
2. Gelişmiş sekmesinde Ortam değişkenlerini açıyoruz
3. Sistem değişkenleri altına JAVA_HOME (bu kullanıcının jre'yi kurmuş olduğu dizini gösterecek)'u ekliyoruz. (Bu genellikle C:\Program Files\Java\jre1.5.0_02 şeklinde birşeyler olabilir)
4. Daha sonra Sistem değişkenleri altındaki PATH değişkeninin sonuna ;%JAVA_HOME%\bin ekliyoruz.
5. Ve şimdi artık java komutu sorunsuz çalışıyor olmalı.

GNU/Linux'te bash shell: export PATH=$PATH:java_evi/bin
tcsh veya csh: set PATH = ($PATH java_evi/bin)

GNU/Linux'te fazla ayrıntıya girmiyorum. Zaten GNU/Linux kullanan kişi bunu nasıl yapacağını benden iyi biliyordur.

Path ayarları tamamlandıktan sonra jarımız çalışacaktır.

Daha Fazla Bilgi:
https://docs.oracle.com/javase/1.5.0/docs/guide/jar/index.html
https://docs.oracle.com/javase/tutorial/deployment/jar/

29 yorum:

Adsız dedi ki...

Arkadaşım eyvallah çok güzel yazmışın açıklamışsın. hepsini harfiyen yaptım ama benim jar dosya yine çalışmıyo yine çalışmıyo
bir haftadır ne denediysem omadı ... şu jara dönüşemiyo heralde yasaklı mı ne , artık format atıcam pcye yada işlemcinin üstüne asit dökücem.

T. E. Kalaycı dedi ki...

:S Komut istemcisinden çalıştırıp varsa oluşan istisnaları inceleyebilirsin. Yanlış birşeyler olmalı, ihtiyaç duyduğu kütüphaneler vardır belki de, onları classpath'e eklemek gerekiyor olabilir.

Adsız dedi ki...

Sağol
Sayende tabiri yerinde ise microsoftun oyuncağı olmaktan biraz daha kurtulduk

Adsız dedi ki...

benim simdi jar var ama programin icinde kullandigim resim dosyalarini yanina koymam gerekio. ozaman da daginik gozukuo bayaa. o resimleri koymak icin ozel bi klasor yok mu jar direk ordan algilasin. bu arada netbeans ten yaptim jar i.

T. E. Kalaycı dedi ki...

Merhaba,

Kullanacağınız resimleri bir paket içerisine koyup jar içerisinde barındırdıktan sonra buradaki kod örneklerini inceleyerek kullanabilirsiniz. Bir başka yöntem resimleri bir dizin içerisine koyup erişirken dosya isminin başına dizin ismini girmek olacaktır.

Adsız dedi ki...

Üstad bu iş bu kdar basit miydi? Yüklemediğim sdk jdk kalmadı? Komut satırına neler yazmnadım ki. Çok sağolasın. Denedim çalıştı. çok da hoş oldu. Eclipse böyle bir özelliğe sahip olduğunu bilmiyordum bile. Gerçekten çok sağol.

dea dedi ki...

hocam benimde jar yapmam gereken dosyalar var ama java ile alakası yok
3 tane klasörü yapmam gerekiyor. içinde xul dtd ve rdf gibi uzantılar var ama o dosyalar önemli değil 3 klasörü birden jar yapmam gerekiyor. Mümkün mü?

T. E. Kalaycı dedi ki...

Merhaba,

Evet mümkündür. http://java.sun.com/developer/Books/javaprogramming/JAR/basics/ adresindeki create a jar kısmındaki komuttan yararlanabilirsiniz. Ama JAVA PATH ayarı yapmış olmanız gerekebilir. jar komutu Java evindeki bin dizini altındadır.

Adsız dedi ki...

Merhaba,

Yazınız için teşekkür ederim, çok açıklayıcı olmuş yalnız ben netbeans 6.8 ve sdk 1.6 ile bir kod yazdım fakat netbeans ten aldığım .jar file javanın 1.6 versiyonunun alt versiyonlarında çalışmıyor. Benim java 1.4.2 versiyonunda çalışabilen bir .jar file oluşturmam lazım. Mümkün müdür?

T. E. Kalaycı dedi ki...

Merhaba,

Hazırladığınız projeyi derlerken ve ilgili dosyaları oluştururken hedef olarak Java 1.4.2 seçerseniz istediğiniz bir bir JAR elde edebilirsiniz. Ama eğer Java 1.6 sürümüne özgü kullanımlarınız (Autoboxing, for each gibi) varsa onları da 1.4.2 sürümüne uygun bir şekilde değiştirmeniz gerekecektir. Netbeanste muhtemelen projeler için hedef JDK sürümü diye bir seçenek vardır.

mehmet kınıklı dedi ki...

Merhaba Tahir hocam,
Akdeniz Üniversitesi elek-elektronik 2. sınıf öğrencisiyim.Bu dönem Java dersi aldık ama hoca hiç birşey anlatmadı sadece proje yapın gelin dedi.Bizde
bluetoot ile kontrol edilen oyuncak araba yapalım dedik ve araştırmaya başladık. elde ettiğim verilerle devreyi kurduk ve bir siteden java kodkarını aldık.
Ancak kodları türçeye çevirip telefona atınca uygulamayı başlatmıyor.Sanırsam biz dosyaları direk winrardan jar uzantılı çevirdiğimizden.Sizden bu konuda
yardımınızı istiyoruz Tahir hocam.
teşekkür ederiz...

T. E. Kalaycı dedi ki...

Merhaba,

Telefon için JAR üretimi benim sitede anlattığımdan farklı aslında. Hali hazırda normal bilgisayar için yazdığınız kod, cep telefonunda çalışmayacaktır. Geliştirme, derleme ve paket oluşturma işlemlerini J2ME ortamında yapmanız gerekmektedir. Konuyla ilgili olarak aşağıdaki adreslerdeki başlangıç öğrenceleri işinize yarayabilir:

http://today.java.net/pub/a/today/2005/02/09/j2me1.html
http://yzgrafik.ege.edu.tr/~aybars/acg/J2ME&M3Gson.ppt
http://ab.org.tr/ab07/bildiri/148.doc
http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition
http://tim.oreilly.com/pub/a/onjava/2001/03/08/J2ME.html
http://www.digilife.be/quickreferences/pt/j2me%20step%20by%20step.pdf
http://en.wikibooks.org/wiki/J2ME_Programming

Adsız dedi ki...

Hocam sağolun eğer ödevi teslim edebilirsem bu çok işime yarayacak bir yazı olmuş. Anadolu üniversitesi bilg. müh. 1. sınıf öğrencisiyim. Hoca ödev olarak hareket eden bir dikdörtgen yapmamızı istedi ve pencereye yön okları da koymamız gerekiyormuş, bastıkça hareket edecekmiş. Ama ben buna benzer hiçbir örnekle karşılaşmadığım için hiç ilerleyemiyorum. Yardımcı olursanız çok sevinirim...

Adsız dedi ki...

eclipse'te bunu yaparken olusturulacak jar için konum bilgisi giriyoruz yazmıssınız bunu biraz acabilir misiniz. ben .java uzantılı dosyayı zipleyip jar için konum dosyası seçin kısmında bunu seçtim yaptığım yanlıs mı olur. simdiden tesekkürler.

Adsız dedi ki...

Download ettiğim bir jar dosyasını çalıştırmak istiyorum bu şekilde ama dediğini yapmama rağmen dosya açılmıyor, hatada vermiyor, masaüstünde çalıştıramıyorum. Neden bu durum oluşuyor olabilir, teşekkürler.

Adsız dedi ki...

merhaba. Ben eclipse'de bulduğum bazı kodları derledim ve .jar yapmaya çalşıyorum ama beceremedim :) class'ların üzerinde ünlem işareti var, o yüzden olabilir mi? ama ctrl+f11 yapınca çalışıyo. Sizce sorun nedir?

Adsız dedi ki...

Jar yaparken Main Class kısmı boş geliyo bir şey seçemiyorum. Sebebi nedir?

Gürcan Kavakçı dedi ki...

İyi günler, oluşturduğumuz proje eğer bir jar dosyasını kullanıyorsa, bu jar dosyasını bizim oluşturduğumuz çalıştırılabilir jar dosyasına nasıl atacağız. Eclipse de export ederken göremiyorum

T. E. Kalaycı dedi ki...

Yeni eclipse sürümlerinde "package required libraries into generated jar" diye bir seçenek oluyor, o seçeneği seçtiğinizde oluşturduğunuz JAR dosyası içerisine kullandığınız kütüphaneler de ekleniyor. Ayrıca "main class" seçimi yerine "launch configuration" altında çalıştırmak için kullandığınız yapılandırmayı seçebiliyorsunuz. Örnek olarak şu resime bakabilirsiniz:
http://4.bp.blogspot.com/_q2w_6A_X04U/TMmuwFQ8uQI/AAAAAAAAAY4/ftbF1mX7FBg/s1600/02_export_2.png

Kaynak: http://auralbits.blogspot.com/2010/10/automating-java-application-packaging.html

Adsız dedi ki...

Merhaba,
şimdi benim 2 tane classım var ve onların içinde de gerekli oyun kodları var. jar yapmam gerek ama launch configuration kısmında benim projem gelmiyor. yalnızca class kullandığım için olabilir mi sizce? form olan bir applet falan da mı açmam gerek? Kafam iyice karıştı açıkçası, çok zor işmiş bu java :)

T. E. Kalaycı dedi ki...

Eclipse ile geliştirmediyseniz komut satırı yöntemini kullanmanızı öneririm.

Unknown dedi ki...

Merhaba,.jar yapmam gerek.Eclipsle geliştirdim kodu ama launch configuration kısmında benim projem gelmiyor.Neden olabilir?
Yazı için teşekkür ederim.

Unknown dedi ki...

Merhaba,yazı içi teşekkürler.
Ben eclipce-le geliştirdim kodu ama launch configuration kısmında benim projem gelmiyor.Neden olabilir?

T. E. Kalaycı dedi ki...

Merhaba,

Programınızda çalıştırılabilir main içeren Java sınıfı olmayabilir, olduğundan emin olun.

İyi çalışmalar

Adsız dedi ki...

tahir bey ben java eclipsede super mario oyun kodunu çalıştırcam ama bulduğum kodda herhangi bir main class yok peki main class olmadan jar dosyası oluşturmam mümkün mü?

T. E. Kalaycı dedi ki...

Java'da uygulamanın çalışması için gerekli olan main metodunu içerisinde barındıran sınıf ana sınıftır. Uygulamanın çalışabilmesi için bu metoda mutlaka ihtiyaç var.

Adsız dedi ki...

jardan kaynak koda ulaşabilirmiyim? baktım ama bi sonuca varamadım jardaki .class uzantılı dosyalardan...

T. E. Kalaycı dedi ki...

*.class dosyalarının kaynak kodlarını üretmek için Java decompiler kullanmak gerekiyor. JAD (GUI için: DJ Java Decompiler), JD gibi farklı araçlarla bu yapılabiliyor.

Adsız dedi ki...

teşekkürler; bu işime yarayabilir sanırım. kolay gelsin tekrar teşekkür ederim :)