Java Tip 120: Wykonaj samorozpakowujące się pliki JAR

Od wielu lat tworzenie archiwum przez Phila Katza, zip, jest jednym z najpopularniejszych formatów archiwizacji plików. Firma Sun przyjęła format zip jako podstawę dla archiwum Java (JAR). Firma Sun rozszerzyła wykorzystanie formatu zip o różne konwencje, dzięki czemu można spakować klasy Java do pliku archiwum. Po dodaniu pliku manifestu JAR środowisko wykonawcze Java może łatwo zlokalizować i bezpośrednio wykonać główną klasę aplikacji Java zawartą w pliku jar.

Niektóre zipnarzędzia narzędziowe mogą tworzyć samorozpakowujące się archiwa dla różnych platform, takich jak MS Windows. Narzędzie to łączy zwykłe archiwum zip z programem do wyodrębniania w celu wygenerowania nowego pliku wykonywalnego (exe). Odbiorcy pliku exe muszą go tylko uruchomić, aby wyodrębnić zawartość oryginalnego archiwum zip. Plik wykonywalny uruchamia program do wyodrębniania w celu wyodrębnienia zarchiwizowanych plików do katalogu wyjściowego określonego przez użytkownika.

Możesz przekonwertować podstawowy plik ZIP lub JAR na wykonywalny plik JAR na dowolnej platformie Java. Podczas gdy samorozpakowujący się plik zip może tworzyć tylko pliki wykonywalne specyficzne dla platformy, samorozpakowujący się plik jar może być dystrybuowany i uruchamiany na dowolnej platformie obsługującej język Java.

Tworzenie samorozpakowującego się pliku jar jest proste. Potrzebujesz tylko specjalnego pliku manifestu JAR, programu do ekstrakcji opartego na języku Java, pliku ZIP lub JAR zawierającego podstawowe pliki zawartości oraz dowolnej aplikacji narzędziowej Java SDK jar.

Plik manifestu

Aby utworzyć wykonywalne pliki JAR, najpierw potrzebny jest plik manifestu o nazwie MANIFEST.MFw META-INFkatalogu. Plik manifestu może zawierać wiele możliwych wpisów; jednak dla naszych celów musimy tylko określić nazwę klasy Java, która zawiera main()metodę programu ekstraktora opartego na Javie :

Klasa główna: ZipSelfExtractor 

Dodaliśmy plik manifestu o nazwie jarmanifestdo przykładowego kodu tej wskazówki. Aby uzyskać więcej informacji na temat pliku manifestu, zobacz specyfikację pliku Jar.

Ekstraktor

Możesz stworzyć program ekstraktora na różne sposoby. Przedstawione tutaj podejście jest proste i nieskomplikowane. Najpierw program do wyodrębniania ustala nazwę samorozpakowującego się pliku jar. Mając tę ​​nazwę pod ręką, ekstraktor wykorzystuje standardowe, wbudowane biblioteki Java zip / jar do wyodrębnienia plików zawartości z archiwum. Możesz znaleźć pełny kod źródłowy ZipSelfExtractorw ZipSelfExtractor.java.

Uzyskanie nazwy pliku jar w programie do ekstrakcji może być trudne. Chociaż nazwa pliku jar pojawia się w wierszu poleceń, nie jest ona przekazywana do metody klasy main(). Dlatego w programie do ekstrakcji używamy następującego kodu, aby wyodrębnić informacje z adresu URL wskazującego na ekstraktor:

private String getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); String urlStr = urlJar.toString (); int from = "jar: file:". length (); int to = urlStr.indexOf („! /”); return urlStr.substring (od, do); }

Zauważ, że w getSystemResource()metodzie przekazujemy myClassNamezamiast ZipSelfExtractor.class. To pozwala nam zmienić nazwę programu ekstraktora bez zmiany tej części kodu. Ustawiamy myClassName, wyszukując nazwę bieżącej klasy.

Następnie wyodrębniamy nazwę pliku jar. Najpierw prosimy o podanie adresu URL do pliku klasy zawierającego aktualnie uruchomioną klasę (czyli program do ekstrakcji). Kiedy już mamy adres URL, możemy wyciąć nazwę pliku jar. Z definicji adres URL programu do wyodrębniania plików JAR ma następujący format:

  1. jar:, co pokazuje, że plik wykonywalny jest uruchamiany z wnętrza pliku jar
  2. Adres URL pliku jar, taki jak file:/C:/temp/test.jar, po którym następuje !znak
  3. Nazwa ścieżki wewnętrznej pliku w pliku JAR, na przykład /ZipSelfExtractor.class

W przypadku programu do ekstrakcji adres URL może wyglądać następująco:

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

Teraz, gdy mamy już nazwę pliku jar, możemy przeprowadzić wyodrębnienie. Wnętrzności programu do rozpakowywania polegają na wbudowanych bibliotekach Java służących do manipulacji plikami zip / jar, które dekompresują pliki zawartości zawarte w archiwum. Zobacz Zasoby, aby uzyskać więcej informacji na temat bibliotek manipulacji plikami zip / jar.

Aby ułatwić użytkowanie, ekstraktor jest graficzną aplikacją Java. Aplikacja używa JFileChooserklasy, aby umożliwić użytkownikom określenie katalogu docelowego, do którego mają wyodrębnić pliki. A ProgressMonitorpokazuje postęp procesu ekstrakcji. Jeśli plik może nadpisać już istniejący plik, użytkownik jest pytany, czy nadpisać istniejący plik. Na zakończenie standardowe okno dialogowe przedstawia statystyki ekstrakcji.

Na koniec program do wyodrębniania sprawdza, czy nie wyodrębnia plików powodujących samorozpakowujący się plik jar - pliku manifestu i pliku ekstraktora .class; program powinien po prostu wyodrębnić oryginalną zawartość pliku JAR. Te dwa pliki są artefaktami samorozpakowującego się pliku jar i nie są częścią oryginalnych, podstawowych plików zawartości.

Pakowanie pliku jar

Teraz, gdy mamy plik manifestu i program do wyodrębniania, możemy zbudować samorozpakowujący się plik jar. Możemy ręcznie użyć jarnarzędzia JDK, aby utworzyć samorozpakowujący się plik jar. Na przykład zakładając, że masz plik zip o nazwie myzip.zip, możesz wykonać następujące kroki, aby utworzyć z niego samorozpakowujący się plik:

  1. cd do katalogu zawierającego myzip.zip
  2. Pobieranie zipper.jar
  3. Wypakuj pliki do bieżącego katalogu. Zrobiliśmy z niego samorozpakowujący się JAR:
    java -jar zipper.jar 
  4. Skopiuj zipper.classplik doZipSelfExtractor.class
  5. Zmień nazwę myzip.zipnamyzip.jar
  6. Zaktualizuj myzip.jarza pomocą plików jarmanifesti ZipSelfExtractor.class:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Teraz myzip.jarjest samorozpakowujący się na wszystkich platformach zawierających środowisko Java Runtime Environment (JRE) 1.2 lub nowsze. Aby uruchomić samorozpakowujący się plik jar, uruchom:

java -jar myzip.jar 

Zwróć uwagę, że niektóre platformy mogą mieć już skonfigurowane wiązania, dzięki czemu można uruchomić plik jar po prostu klikając myzip.jarikonę pliku, co spowoduje uruchomienie odpowiednika wiersza poleceń.

Ćwiczenie dla czytelnika

Bieżący ZipSelfExtractnie integruje się dobrze, jeśli utworzysz samorozpakowujący się plik JAR z istniejącego pliku jar zawierającego plik manifestu. Dodaj inteligencję do samorozpakowującego i instrukcje tworzenia, aby móc radzić sobie z istniejącymi plikami jar, które zawierają pliki manifestu.

Uwolnij rękę od JARa

Samorozpakowujący się plik jar to dobry mechanizm dystrybucji plików między platformami. Samorozpakowujące się pliki JAR są łatwe do utworzenia, a minimalne wymagania użytkownika związane z instalacją środowiska JRE w wersji 1.2 lub nowszej to rozsądny kompromis w uzyskaniu obsługi wielu platform.

Zamiast ręcznie tworzyć samorozpakowujący się plik jar, wypróbuj ZipAnywhere. ZipAnywhere jest w pełni funkcjonalny zip/ jarnarzędzie narzędzie napisane w 100% czysta Java. Jest to darmowe narzędzie oparte na graficznym interfejsie użytkownika a la WinZip, które może tworzyć samorozpakowujące się pliki jar jednym kliknięciem przycisku.

Dr Zunhe Steve Jin jest inżynierem oprogramowania w firmie Rational Software i autorem ZipAnywhere. John D. Mitchell jest redaktorem współpracującym z kolumną JavaWorld Tips 'N Tricks. John jest także założycielem i głównym architektem Non, Inc., firmy zajmującej się doradztwem w zakresie technologicznego zarządzania ryzykiem biznesowym.

Dowiedz się więcej na ten temat

  • Pobierz pliki źródłowe tej wskazówki

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

  • "Java Tip 49How to Extract Java Resources from JAR and Zip Archives," John D. Mitchell and Arthur Choi (JavaWorld)

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

  • "Java Tip 70Create Objects from Jar Files!" John D. Mitchell (JavaWorld)

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

  • Jar File Specification

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

  • JAR command line guide

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

  • ZipAnywhere, GUI-based self-extracting JAR creation tool

    //www.geocities.com/zipanywhere

  • View all previous Java Tips and submit your own

    //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

Ten artykuł „Java Tip 120: Execute self-extracting JARs” został pierwotnie opublikowany przez JavaWorld.