Java savjet 120: Izvršite JAR-ove koji se samoraspakuju

Dugo godina je stvaranje arhiva, zip, Phil Katza jedan od najpopularnijih formata za arhiviranje datoteka. Sun je usvojio zip format kao osnovu za Java Archive (JAR). Sun je proširio upotrebu zip formata raznim konvencijama tako da Java pakete možete spakirati u arhivsku datoteku. Dodavanjem JAR manifestne datoteke, Java izvršavanje može lako pronaći i izravno izvršiti glavnu klasu Java aplikacije koja se nalazi u jar datoteci.

Neki zipuslužni alati mogu stvoriti samoraspakirajuće arhive za razne platforme, poput MS Windows. Uslužni alat kombinira uobičajenu zip arhivu s programom za izvlačenje kako bi generirao novu izvršnu (exe) datoteku. Prijemnici exe datoteke trebaju je pokrenuti samo da bi izdvojili izvorni sadržaj zip arhive. Izvršna datoteka pokreće ekstraktorski program za izdvajanje arhiviranih datoteka u izlazni direktorij koji je odredio korisnik.

Možete pretvoriti osnovnu zip ili jar datoteku u izvršnu jar datoteku na bilo kojoj Java platformi. Dok samoraspakirajući zip može stvoriti samo izvršne datoteke specifične za platformu, samoraspakirajuća datoteka jar može se distribuirati i pokretati na bilo kojoj platformi koja podržava Javu.

Stvaranje samoraspakirajuće datoteke jar je jednostavno. Trebate samo posebnu datoteku JAR manifesta, program za ekstrakciju zasnovan na Javi, zip ili jar datoteku koja sadrži osnovne datoteke sadržaja i bilo koji jaruslužni program Java SDK .

Datoteka manifesta

Da biste napravili izvršne JAR-ove, prvo trebate datoteku manifesta koja se zove MANIFEST.MFu META-INFdirektoriju. Datoteka manifesta može sadržavati brojne moguće unose; međutim, za naše svrhe ovdje samo trebamo navesti ime klase Java koja sadrži main()metodu izvlačenja koja se temelji na Javi :

Glavna klasa: ZipSelfExtractor 

U jarmanifestprimjer koda ovog savjeta dodali smo datoteku manifesta koja se zove . Dodatne informacije o datoteci manifesta potražite u specifikaciji datoteke Jar.

Izvlakač

Program izvlačenja možete napraviti pomoću različitih pristupa. Pristup koji ovdje predstavljamo je jednostavan i neposredan. Prvo, program za ekstrakciju otkriva naziv samoraspakirajuće datoteke jar. S tim imenom u ruci, ekstraktor koristi standardne, ugrađene Java zip / jar knjižnice za izdvajanje datoteka sadržaja iz arhive. Možete naći cijeli izvorni kod za ZipSelfExtractoru ZipSelfExtractor.java.

Dohvaćanje naziva datoteke jar u programu za izvlačenje može biti nezgodno. Iako se ime datoteke jar pojavljuje u naredbenom retku, to se ime ne prenosi main()metodi klase . Stoga u programu za izvlačenje koristimo sljedeći kôd za izvlačenje podataka iz URL-a koji upućuje na izvlakač:

privatni niz getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); Niz urlStr = urlJar.toString (); int from = "jar: datoteka:". length (); int do = urlStr.indexOf ("! /"); return urlStr.substring (od, do); }

Primijetite da u getSystemResource()metodi koju donosimo myClassNameumjesto ZipSelfExtractor.class. To nam omogućuje promjenu naziva programa za izvlačenje bez mijenjanja tog dijela koda. Krenuli smo myClassNametražeći ime trenutne klase.

Zatim izdvajamo ime datoteke jar. Prvo tražimo URL datoteke datoteke koja sadrži trenutno pokrenutu klasu (a to je program za izvlačenje). Nakon što dobijemo URL, možemo izrezati ime datoteke jar. Po definiciji, URL JAR programa za izvlačenje slijedi osnovni format:

  1. jar:, koji pokazuje da se izvršna datoteka izvodi iz jar datoteke
  2. URL jar datoteke, na primjer file:/C:/temp/test.jar, slijedi !znak
  3. Interno ime puta datoteke unutar JAR-a, kao što je /ZipSelfExtractor.class

U slučaju programa za izvlačenje, URL može izgledati ovako:

jar: datoteka: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Sad kad imamo ime jar datoteke, možemo izvršiti ekstrakciju. Crijeva programa za ekstrakciju oslanjaju se na ugrađene Java zip / jar biblioteke za manipulaciju datotekama kako bi se dekomprimirale datoteke sadržaja sadržane u arhivi. Pogledajte Resurse za više informacija o bibliotekama zip / jar datoteka za manipulaciju datotekama.

Radi lakšeg korištenja, ekstraktor je grafički Java program. Aplikacija koristi JFileChooserklasu kako bi omogućila korisnicima da odrede odredišni direktorij u koji žele da se datoteke izvade. A ProgressMonitorpokazuje napredak postupka ekstrakcije. Ako bi datoteka mogla prebrisati već postojeću datoteku, korisnik se pita hoće li zamijeniti postojeću datoteku ili ne. Na kraju, standardni dijaloški okvir prikazuje statistiku izdvajanja.

Konačno, program za izvlačenje provjerava da ne izvlači datoteke koje čine datoteku jar-a samoraspakirajućom - datoteku manifesta i datoteku izvlakača .class; program bi trebao samo izdvojiti izvorni JAR sadržaj. Te dvije datoteke su artefakti samoraspakirajuće datoteke jar, a nisu dio izvornih datoteka osnovnog sadržaja.

Pakiranje datoteke staklenke

Sad kad imamo datoteku manifesta i program za izvlačenje, možemo izgraditi samoraspakirajuću datoteku jar. Možemo ručno koristiti jaruslužni program JDK za izradu samoraspakirajuće datoteke jar. Na primjer, pod pretpostavkom da se zove zip datoteka myzip.zip, možete izvesti sljedeće korake kako biste od nje napravili samoraspakirajuću datoteku:

  1. cd u direktorij koji sadrži myzip.zip
  2. preuzimanje datoteka zipper.jar
  3. Izdvojite datoteke u trenutni direktorij. Napravili smo ga samoraspakirajućim JAR-om:
    java -jar zatvarač.jar 
  4. Kopirajte zipper.classdatoteku uZipSelfExtractor.class
  5. Preimenuj myzip.zipumyzip.jar
  6. Ažuriranje myzip.jarsa jarmanifesti ZipSelfExtractor.classdatoteke:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Sada myzip.jarse samoraspakuje na svim platformama koje sadrže Java Runtime Environment (JRE) 1.2 ili novije. Da biste izvršili samoraspakirajuću jar datoteku, pokrenite:

java -jar myzip.jar 

Imajte na umu da neke platforme mogu imati vezove koji su već postavljeni tako da možete izvršiti jar datoteku samo klikom na myzip.jarikonu datoteke koja će pokrenuti ekvivalent naredbenog retka.

Vježba za čitatelja

Struja ZipSelfExtractse ne integrira dobro ako napravite JA koji se samoraspakuje iz postojeće datoteke jar koja sadrži datoteku manifesta. Dodajte inteligenciju u samoizvlačivač i upute za stvaranje kako biste mogli rješavati postojeće jar datoteke koje sadrže datoteke manifesta.

Oslobodite ruku iz JAR-a

Samoraspakirajuća datoteka jar dobar je mehanizam za distribuciju datoteka na više platformi. Samoraspakirajuće JAR-ove lako je stvoriti, a minimalni korisnički zahtjev za instalaciju JRE 1.2 ili novije verzije razuman je kompromis za dobivanje podrške na više platformi.

Umjesto ručnog stvaranja samoraspakirajuće datoteke jar, provjerite ZipAnywhere. ZipAnywhere je cjeloviti zip/ jaruslužni alat napisan na 100% čistoj Javi. To je besplatni alat zasnovan na GUI-u a la WinZip i može stvoriti samoraspakirajuće datoteke jar pritiskom na gumb.

Dr. Zunhe Steve Jin osobni je softverski inženjer u tvrtki Rational Software i autor knjige ZipAnywhere. John D. Mitchell urednik je kolumne N Tricks JavaWorld Tipsa. John je također osnivač i glavni arhitekt tvrtke Non, Inc., konzultantske prakse za upravljanje tehnološkim poslovnim rizikom.

Saznajte više o ovoj temi

  • Preuzmite izvorne datoteke za ovaj savjet

    //www.javaworld.com/javaworld/javatips/javatip120/zipper.jar

  • "Savjet Java 49Kako izvući Java resurse iz JAR i Zip arhiva," John D. Mitchell i Arthur Choi ( JavaWorld )

    //www.javaworld.com/javaworld/javatips/jw-javatip49.html

  • "Java Savjet 70Izradite objekte iz Jar datoteka!" John D. Mitchell ( JavaWorld )

    //www.javaworld.com/javaworld/javatips/jw-javatip70.html

  • Specifikacija datoteke Jar

    //java.sun.com/j2se/1.3/docs/guide/jar/jar.html

  • Vodič za JAR naredbenu liniju

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/jar.html

  • ZipAnywhere, samoraspakirajući alat za stvaranje JAR-a temeljen na GUI-u

    //www.geocities.com/zipanywhere

  • Pogledajte sve prethodne Java savjete i pošaljite svoje

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Browse articles by topic in JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-topical-index.shtml

  • Speak out in our Java Forum

    //forums.idg.net/[email protected]@.ee6b802

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • You'll find a wealth of IT-related articles from our sister publications at .net

Ovu je priču "Java tip 120: Izvršite samoraspakirajuće JAR-ove" izvorno objavio JavaWorld.