Visą programos klasių ir išteklių rinkinį galite lengvai supakuoti į „Java“ archyvą (JAR). Tiesą sakant, tai yra vienas tikslas turėti stiklainių failus. Kitas dalykas yra leisti vartotojams lengvai vykdyti archyve saugomą programą. Kodėl tada „jar“ failai yra antros klasės „Java“ visatos piliečiai, veikiantys tik kaip archyvai, kai jie gali būti pirmos klasės, greta vietinių vykdomųjų failų?
Norėdami vykdyti jar failą, galite naudoti
java
komandos
-jar
variantą. Pvz., Tarkime, kad turite paleistiną stiklainio failą
myjar.jar
. Kadangi failą galima paleisti, galite jį vykdyti taip:
java -jar myjar.jar
.
Arba „Java Runtime Environment“ (JRE), įdiegta tokioje operacinėje sistemoje kaip „Microsoft Windows“, susieja „jar“ failus su JVM, kad galėtumėte juos dukart spustelėti, kad paleistumėte programą. Šie JAR turi būti vykdomi.
Kyla klausimas: kaip padaryti JAR važiuojamą?
Aprašo failas ir įrašas „Pagrindinė klasė“
Daugumoje JAR failas vadinamas
MANIFEST.MF
yra saugomas kataloge, vadinamame
META-INF
. Tame faile vadinamas specialus įrašas
Pagrindinė klasė
pasakoja
java -jar
komanda, kurią klasę vykdyti.
Problema ta, kad jūs patys turite tinkamai pridėti šį specialųjį įrašą į manifesto failą - jis turi eiti tam tikroje vietoje ir turėti tam tikrą formatą. Tačiau kai kuriems iš mūsų nepatinka redaguoti konfigūracijos failus.
Leiskite API tai padaryti už jus
Nuo „Java 1.2“ paketas vadinamas java.util.jar
leido jums dirbti su failais. (Pastaba: ji remiasi java.util.zip
paketas.) Konkrečiau, „jar“ paketas leidžia lengvai valdyti tą specialų manifesto failą per Manifestas
klasė.
Parašykime programą, naudojančią šią API. Pirma, ši programa turi žinoti apie tris dalykus:
- JAR mes norime padaryti bėgimą
- Pagrindinė klasė, kurią norime vykdyti (ši klasė turi egzistuoti JAR viduje)
- Naujo mūsų išvesties JAR pavadinimas, nes neturėtume paprasčiausiai perrašyti failų
Parašykite programą
Aukščiau pateiktas sąrašas sudarys mūsų programos argumentus. Šiuo metu pasirinkite tinkamą šios programos pavadinimą. Kaip „MakeJarRunnable“
garsas?
Patikrinkite pagrindinius argumentus
Tarkime, kad pagrindinis mūsų įėjimo taškas yra standartas pagrindinis (eilutė [])
metodas. Pirmiausia turėtume patikrinti programos argumentus čia:
if (args.length! = 3) {System.out.println ("Naudojimas: MakeJarRunnable" + ""); System.exit (0); }
Atkreipkite dėmesį į tai, kaip aiškinamas argumentų sąrašas, nes jis yra svarbus šiam kodui. Argumentų tvarka ir turinys nėra akmenyje; tačiau nepamirškite tinkamai modifikuoti kito kodo, jei juos pakeisite.
Pasiekite JAR ir jo manifesto failą
Pirmiausia turime sukurti keletą objektų, kurie žino apie JAR ir manifestų failus:
// Sukurkite „JarInputStream“ objektą ir gaukite jo manifestą „JarInputStream“ jarIn = new JarInputStream (new FileInputStream (args [0])); Manifesto manifestas = jarIn.getManifest (); if (manifest == null) {// Taip nutiks, jei jokio manifesto nebus manifest = new Manifest (); }
Nustatykite pagrindinės klasės atributą
Mes įdėjome Pagrindinė klasė
įrašas aprašo failo pagrindinių atributų skyriuje. Gavę šį požymių rinkinį iš manifesto objekto, galime nustatyti atitinkamą pagrindinę klasę. Tačiau kas būtų, jei a Pagrindinė klasė
atributas jau yra pradiniame JAR? Ši programa tiesiog išspausdina įspėjimą ir išeina. Galbūt galėtume pridėti komandinės eilutės argumentą, nurodantį programai naudoti naują vertę, o ne iš anksto esamą:
Atributai a = manifest.getMainAttributes (); String oldMainClass = a.putValue („Pagrindinė klasė“, argumentai [1]); // Jei yra sena reikšmė, pasakykite vartotojui ir išeikite, jei (oldMainClass! = Null) {System.out.println ("Įspėjimas: senoji Pagrindinės klasės reikšmė yra:" + oldMainClass); „System.exit“ (1); }
Išveskite naują JAR
Turime sukurti naują stiklainio failą, todėl turime naudoti „JarOutputStream“
klasė. Pastaba: Turime užtikrinti, kad išvestyje nenaudosime to paties failo kaip įvesties. Arba galbūt programa turėtų apsvarstyti atvejį, kai abu failai yra vienodi, ir paraginti vartotoją, jei jis nori perrašyti originalą. Tačiau pasilieku tai kaip pratimą skaitytojui. Su kodu!
System.out.println ("Rašymas į" + args [2] + "..."); JarOutputStream jarOut = new JarOutputStream (naujas FileOutputStream (argumentai [2]), manifestas);
Turime parašyti kiekvieną įrašą iš įvesties JAR į išvestį JAR, todėl kartokite įrašus:
// Sukurkite skaitymo buferį, norėdami perkelti duomenis iš įvesties baito [] buf = naujas baitas [4096]; // Kartoti įrašus JarEntry entry; while ((entry = jarIn.getNextJarEntry ())! = null) {// Išskirkite manifesto failą iš senojo JAR, jei („META-INF / MANIFEST.MF“ .equals (entry.getName ())) tęsis; // Parašykite įrašą į išvestį JAR jarOut.putNextEntry (įrašas); int skaityti; while ((skaityti = jarIn.read (buf))! = -1) {jarOut.write (buf, 0, skaityti); } jarOut.closeEntry (); } // Nuplaukite ir uždarykite visus srautus jarOut.flush (); jarOut.close (); jarIn.close ();
Užbaigti programą
Žinoma, šį kodą turime įdėti į a pagrindinis
metodą, klasės viduje ir su tinkamu importo pareiškimų rinkiniu. Išteklių skyriuje pateikiama visa programa.
Naudojimo pavyzdys
Panaudokime šią programą naudodami pavyzdį. Tarkime, kad turite programą, kurios pagrindinis įėjimo taškas yra vadinamoje klasėje HelloRunnableWorld
. (Tai yra visas klasės pavadinimas.) Taip pat tarkime, kad sukūrėte JAR, vadinamą myjar.jar
, kuriame yra visa paraiška. Bėk „MakeJarRunnable“
šiame stiklainio faile taip:
java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar
Vėlgi, kaip minėta anksčiau, atkreipkite dėmesį, kaip aš užsakau argumentų sąrašą. Jei pamiršote užsakymą, tiesiog paleiskite šią programą be jokių argumentų ir ji atsakys naudodama pranešimą.
Pabandykite paleisti
java -jar
komandą
myjar.jar
ir tada toliau
myjar_r.jar
. Atkreipkite dėmesį į skirtumą! Tai padarę, tyrinėkite aprašo failus (
META-INF / MANIFEST.MF
) kiekviename JAR. (Abu JAR galite rasti
pirminis kodas
.)
Štai pasiūlymas: pabandykite pateikti „MakeJarRunnable“
programą į bėgantį JAR!
Bėk su juo
Vykdyti JAR dukart spustelėjus jį arba naudojant paprastą komandą visada yra patogiau nei įtraukti jį į savo klasės kelią ir paleisti konkrečią pagrindinę klasę. Norėdami tai padaryti, JAR specifikacijoje pateikiama: Pagrindinė klasė
JAR manifesto failo atributas. Čia pateikiama programa leidžia jums naudoti „Java“ JAR API, kad galėtumėte lengvai manipuliuoti šiuo atributu ir paleisti JAR.
Sužinokite daugiau apie šią temą
- Atsisiųskite šio patarimo šaltinio kodą ir JAR
//images.techhive.com/downloads/idge/imported/article/jvw/2002/05/makejarrunnable.zip
- „Java Tip 120Execute Self-extracting JARs“, Z. Steve Jin ir John D. Mitchell („JavaWorld“, 2001 m. Lapkričio mėn.)
//www.javaworld.com/javaworld/javatips/jw-javatip120.html
- JAR failo specifikacija
//java.sun.com/j2se/1.3/docs/guide/jar/jar.html
- stiklainis - „Java Archive Tool“
//java.sun.com/j2se/1.3/docs/tooldocs/win32/jar.html
- Peržiūrėti visus ankstesnius „Java“ patarimai ir pateik savo
//www.javaworld.com/javatips/jw-javatips.index.html
- Sužinokite „Java“ iš pagrindų „JavaWorld“s „Java 101“ stulpelį
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
- „Java“ ekspertai atsako į jūsų sunkiausius „Java“ klausimus „JavaWorld“s „Java“ klausimai ir atsakymai stulpelį
//www.javaworld.com/javaworld/javaqa/javaqa-index.html
- Naršykite „Core Java“ skyrius „JavaWorld“s aktuali rodyklė
//www.javaworld.com/channel_content/jw-core-index.shtml
- Likite ant mūsų Patarimų gudrybės prenumeruodami „JavaWorld“nemokami savaitiniai el. pašto naujienlaiškiai
//www.javaworld.com/subscribe
- Sužinokite kliento „Java“ pagrindus „JavaWorld“s „Java“ pradedantysis diskusija. Pagrindinės temos yra „Java“ kalba, „Java“ virtuali mašina, API ir kūrimo įrankiai
//forums.idg.net/webx?50@@.ee6b804
- Rasite daugybę su IT susijusių straipsnių iš mūsų seserų leidinių .net
Šią istoriją „Java Tip 127: See JAR run“ iš pradžių paskelbė „JavaWorld“.