Programavimas

„Java“ patarimas 127: žr. „JAR run“

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:

  1. JAR mes norime padaryti bėgimą
  2. Pagrindinė klasė, kurią norime vykdyti (ši klasė turi egzistuoti JAR viduje)
  3. 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.

Shawnas Silvermanas šiuo metu yra Kanados Manitobos universiteto elektros ir kompiuterių inžinerijos katedros magistrantas. Dirbti su „Java“ jis pradėjo 1996 m. Viduryje ir nuo to laiko naudojasi beveik išimtinai. Šiuo metu jis domisi elektrinių laukų ir skysčių modeliavimu, klaidų taisymo kodais ir puikių GUI (grafinės vartotojo sąsajos) gudrybių įgyvendinimu. Shawnas taip pat dėsto trečio kurso programinės įrangos projektavimo kursą savo universiteto kompiuterių inžinerijos katedroje.

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/[email protected]@.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“.