В продължение на много години създаването на архиви на 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 следва основния формат:
jar:
, което показва, че изпълнимият файл се изпълнява от вътре в jar файла- URL адресът на файла на jar, като например
file:/C:/temp/test.jar
, последван от!
символа - Името на вътрешния път на файла в 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
, можете да изпълните следните стъпки, за да направите саморазархивиращ се файл от него:
cd
към директорията, съдържащаmyzip.zip
- Изтегли
zipper.jar
- Извлечете файловете в текущата директория. Направихме го саморазархивиращ се JAR:
java -jar цип.jar
- Копирайте
zipper.class
файла вZipSelfExtractor.class
- Преименувайте
myzip.zip
катоmyzip.jar
- Актуализиране
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 файлове с едно щракване на бутон.
Научете повече за тази тема
- Изтеглете изходните файлове за този съвет
//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.