Java Tip 120: Изпълнете саморазархивиращи се JAR

В продължение на много години създаването на архиви на Phil Katz, zip, е един от най-популярните формати за архивиране на файлове. Sun е приел zip формата като основа за Java Archive (JAR). Sun разшири използването на zip формата с различни конвенции, така че да можете да опаковате Java класове в архивен файл. С добавянето на JAR файла на манифеста , изпълнението на Java може лесно да намира и изпълнява директно основния клас на приложението Java, съдържащо се в jar файла.

Някои zipпомощни инструменти могат да създават саморазархивиращи се архиви за различни платформи, като MS Windows. Помощният инструмент комбинира обикновен zip архив с програма за извличане, за да генерира нов изпълним (exe) файл. Получателите на exe файла трябва само да го стартират, за да извлекат съдържанието на оригиналния zip архив. Изпълнимият файл изпълнява екстракторната програма за извличане на архивираните файлове в указана от потребителя изходна директория.

Можете да конвертирате основен zip или jar файл в изпълним jar файл на всяка платформа на Java. Докато саморазархивиращият се zip може да създава само изпълними файлове, специфични за платформата, саморазархивиращият се jar файл може да се разпространява и изпълнява на всяка платформа, поддържаща Java.

Създаването на саморазархивиращ се файл на jar е лесно. Трябва ви само специален JAR файл на манифеста, програма за извличане, базирана на Java, zip или jar файл, съдържащ основните файлове със съдържание, и всяко приложение на Java SDK jar.

Файлът на манифеста

За да направите изпълними JAR, първо се нуждаете от файл на манифест, извикан MANIFEST.MFв META-INFдиректорията. Файлът на манифеста може да съдържа редица възможни записи; обаче, за нашите цели тук, просто трябва да посочим името на класа Java, който съдържа метода на Java-базирана програма за main()извличане:

Основен клас: ZipSelfExtractor 

Добавихме файл с манифест, наречен jarmanifestкъм примерния код на този съвет. За повече информация относно файла на манифеста вижте спецификацията на файла Jar.

Екстракторът

Можете да създадете програма за екстрактор, използвайки различни подходи. Подходът, който представяме тук, е прост и ясен. Първо, програмата за извличане определя името на саморазархивиращия се файл на jar. С това име в ръка екстракторът използва стандартните, вградени Java zip / jar библиотеки, за да извлече файловете със съдържание от архива. Можете да намерите пълния изходен код за ZipSelfExtractorв ZipSelfExtractor.java.

Получаването на името на файла на jar в програмата за извличане може да бъде сложно. Въпреки че името на файла на jar се появява в командния ред, това име не се предава на main()метода на класа . Следователно в програмата за екстрактор използваме следния код, за да извлечем информацията от URL адреса, който сочи към екстрактора:

частен низ getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); Низ urlStr = urlJar.toString (); int от = "буркан: файл:". дължина (); int към = urlStr.indexOf ("! /"); върнете urlStr.substring (от, до); }

Забележете, че в getSystemResource()метода, който предаваме myClassNameвместо ZipSelfExtractor.class. Това ни позволява да променим името на програмата за извличане, без да променяме тази част от кода. Зададохме, myClassNameкато потърсихме името на текущия клас.

След това извличаме името на файла на jar. Първо, искаме URL към файла на класа, съдържащ текущия клас (който е програмата за извличане). След като получим URL адреса, можем да изрежем името на файла на jar. По дефиниция URL на програмата за извличане на JAR следва основния формат:

  1. jar:, което показва, че изпълнимият файл се изпълнява от вътре в jar файла
  2. URL адресът на файла на jar, като например file:/C:/temp/test.jar, последван от !символа
  3. Името на вътрешния път на файла в JAR, като /ZipSelfExtractor.class

В случая на програмата за екстрактор URL адресът може да изглежда така:

jar: файл: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Сега, когато имаме името на файла на jar, можем да извършим извличането. Вътрешността на програмата за извличане разчита на вградените Java zip / jar библиотеки за манипулиране на файлове, за да декомпресира съдържателните файлове, съдържащи се в архива. Вижте Ресурси за повече информация за библиотеките за манипулиране на zip / jar файлове.

За по-лесно използване екстракторът е графично Java приложение. Приложението използва JFileChooserкласа, за да позволи на потребителите да посочат целевата директория, в която искат да бъдат извлечени файловете. А ProgressMonitorпоказва напредъка на процеса на екстракция. Ако файл може да замени вече съществуващ файл, потребителят се пита дали да презапише съществуващия файл. В заключение, стандартен диалогов прозорец представя статистика за извличане.

И накрая, програмата за извличане проверява дали не извлича файловете, които правят файла на Jar саморазархивиращ се - файлът на манифеста и файла на екстрактора .class; програмата трябва просто да извлече оригиналното съдържание на JAR. Тези два файла са артефакти на саморазархивиращия се файл на jar и не са част от оригиналните файлове с основно съдържание.

Опаковане на файла с буркана

Сега, когато разполагаме с файла на манифеста и програмата за извличане, можем да изградим саморазархивиращия се файл. Можем ръчно да използваме jarпомощната програма на JDK, за да направим саморазархивиращ се файл. Например, ако приемем, че имате извикан zip файл myzip.zip, можете да изпълните следните стъпки, за да направите саморазархивиращ се файл от него:

  1. cd към директорията, съдържаща myzip.zip
  2. Изтегли zipper.jar
  3. Извлечете файловете в текущата директория. Направихме го саморазархивиращ се JAR:
    java -jar цип.jar 
  4. Копирайте zipper.classфайла вZipSelfExtractor.class
  5. Преименувайте myzip.zipкатоmyzip.jar
  6. Актуализиране myzip.jarс jarmanifestи ZipSelfExtractor.classфайлове:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Сега myzip.jarсе саморазархивира на всички платформи, съдържащи Java Runtime Environment (JRE) 1.2 или по-нова версия. За да изпълните саморазархивиращия се файл на jar, изпълнете:

java -jar myzip.jar 

Имайте предвид, че някои платформи може да имат вече настроени обвързвания, така че да можете да изпълнявате jar файла само като щракнете върху myzip.jarиконата на файла, която ще стартира еквивалент на командния ред.

Упражнение за читателя

Токът ZipSelfExtractне се интегрира добре, ако направите саморазархивиращ се JAR от съществуващ файл на jar, съдържащ файл на манифест. Добавете интелигентност към саморазархиватора и инструкциите за създаване, за да можете да се справяте със съществуващите Jar файлове, които съдържат манифестни файлове.

Освободете ръката си от JAR

Саморазархивиращият се файл на jar е добър механизъм за разпространение на файлове на различни платформи. Саморазархивиращите се JAR файлове са лесни за създаване и минималното изискване на потребителя за инсталиране на JRE 1.2 или по-нова версия е разумен компромис за получаване на поддръжка на различни платформи.

Вместо да създавате ръчно саморазархивиращия се файл, разгледайте ZipAnywhere. ZipAnywhere е пълнофункционален zip/ jarпомощен инструмент, написан на 100% чиста Java. Това е безплатен GUI-базиран инструмент а-ла WinZip и може да създава саморазархивиращи се Jar файлове с едно щракване на бутон.

Д-р Zunhe Steve Jin е персонален софтуерен инженер в Rational Software и автор на ZipAnywhere. Джон Д. Мичъл е редактор в колоната N Tricks на JavaWorld Tips. Джон е основател и главен архитект на Non, Inc., консултантска практика за управление на технологичния бизнес риск.

Научете повече за тази тема

  • Изтеглете изходните файлове за този съвет

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

Тази история „Java Tip 120: Изпълнение на саморазархивиращи се JAR-и“ първоначално е публикувана от JavaWorld.