( З. Стив Джин, Джон Д. Митчелл ) Создавайте удобные в использовании кросс-платформенные Java-архивы. Tips 'N Tricks
Многие годы zip-архивы Фила Каца были одним из наиболее популярных форматов архивирования файлов. Компания Sun приняла формат zip как основу для Java-архивов (JAR). Sun расширила использование формата zip различными конвенциями, обеспечив возможность упаковки классов Java в архив. С дополнением файла манифеста JAR среда исполнения Java-программ может легко найти и непосредственно выполнить main-класс Java-приложения, содержащегося в jar-файле. Некоторые zip-утилиты могут создавать самораспаковывающиеся архивы для различных платформ, например MS Windows. Такая утилита объединяет обычный zip-архиватор с программой, генерирующей новый исполняемый (exe) файл. Получатели exe-файла должны просто запустить его, чтобы извлечь содержимое zip-архива. Исполняемый файл запускает распаковщик для извлечения файлов из архива в указанный пользователем каталог вывода. Вы можете преобразовать обычный zip- или jar-файл в исполняемый jar-файл на любой платформе, поддерживающей Java. Тогда как самораспаковывающийся zip-файл может быть преобразован в исполняемый файл только для определённой платформы, самораспаковывающийся jar-файл может распространяться и выполняться на любой поддерживающей Java платформе. Создать самораспаковывающийся jar-файл просто. Необходимы только специальный файл манифеста JAR, основанная на Java программа-распаковщик, zip- или jar-файл, содержащий файлы с основным содержимым, и любая jar-утилита из Java SDK. Файл манифестаЧтобы делать исполняемые jar-файлы, нужен, прежде всего, файл манифеста с именем MANIFEST.MF в каталоге META-INF . Файл манифеста может содержать множество разных пунктов; однако для наших целей здесь мы должны только определить имя Java-класса, который содержит метод main() основанного на Java распаковщика: Main-класс: ZipSelfExtractor . Мы добавили файл манифеста с именем jarmanifest к коду примера данного совета. Для получения дополнительной информации по файлу манифеста см. спецификацию jar-файла. РаспаковщикПрограмму-распаковщик можно сделать, используя различные подходы. Подход, предлагаемый нами здесь, простой и непосредственный. Сначала программа-распаковщик узнаёт имя самораспаковывающегося jar-файла. Имея это имя, распаковщик использует стандартные, встроенные zip/jar-библиотеки Java, чтобы извлечь файлы, содержащиеся в архиве. Полный исходный текст ZipSelfExtractor можно найти в ZipSelfExtractor.java . Передача имени jar-файла в программу-распаковщик может оказаться непростым делом. Хотя имя jar-файла появляется в командной строке, это имя не передаётся main()-методу класса. Поэтому в программе-распаковщике мы используем следующий код, чтобы извлечь информацию из URL, который указывает на распаковщик: 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(from, to); } Заметьте, что в метод getSystemResource() мы передаем myClassName вместо ZipSelfExtractor.class . Это позволяет изменять имя программы-распаковщика без изменения этой части кода. Мы ищем имя текущего класса, чтобы определить myClassName . Затем мы извлекаем имя jar-файла. Сначала мы запрашиваем URL к файлу класса, содержащему выполняющийся в настоящее время класс (который является распаковщиком). Получив URL, мы можем получить имя jar-файла. По определению, URL программы-распаковщика JAR следует за основным форматом:
В случае программы-распаковщика URL может выглядеть как: jar:file:/home/johnm/test/zipper.jar!/ZipSelfExtractor.class Теперь, имея имя jar-файла, мы можем выполнить разархивацию. Распаковщик опирается на встроенные библиотеки Java для манипулирования zip/jar-файлами, чтобы распаковать файлы, содержащиеся в архиве. См. Ресурсы , чтобы получить дополнительную информацию о библиотеках Java для манипулирования zip/jar-файлами. Для простоты использования распаковщик сделан в виде графического приложения Java. Приложение использует класс JFileChooser , чтобы позволить пользователям определять каталог назначения, в который они хотят извлечь файлы. ProgressMonitor показывает прогресс процесса извлечения. Если файл может быть записан поверх уже существующего файла, пользователь получает запрос, действительно ли следует переписать существующий файл. По завершении стандартное диалоговое окно представляет статистику разархивации. Наконец, программа-распаковщик следит, чтобы не извлечь файлы, которые делают jar-файл самораспаковывающимся, т.е. файл манифеста и .class -файл распаковщика; программа должна только извлечь первоначальное содержание JAR. Эти два файла — принадлежность самораспаковывающегося jar-файла, и не входят в число оригинальных, основных файлов содержимого. Упаковка jar-файлаТеперь, имея файл манифеста и распаковщик, мы можем создать самораспаковывающийся jar-файл. Мы можем вручную использовать jar-утилиту из JDK, чтобы сделать самораспаковывающийся jar-файл. Например, предположив, что у Вас есть zip-файл myzip.zip , Вы можете предпринять следующие шаги, чтобы создать из него самораспаковывающийся файл:
Теперь myzip.jar стал самораспаковывающимся файлом на всех платформах, содержащих среду выполнения Java-программ (JRE) версии 1.2 или позже. Чтобы выполнить самораспаковывающийся jar-файл, введите: java -jar myzip.jar Обратите внимание, что некоторые платформы могут уже иметь привязки таким образом, что jar-файл можно запустить на выполнение, просто щёлкнув мышью по значку файла myzip.jar , что представляет собой эквивалент консольной команды. Упражнение для читателяТекущий ZipSelfExtract не обеспечивает хорошей интеграции, если Вы делаете самораспаковывающийся jar-архив из существующего jar-файла, уже содержащего файл манифеста. Добавьте интеллекта к распаковщику и инструкциям создания, чтобы Вы могли работать с существующими jar-файлами, содержащими файлы манифеста. Свобода действий с JARСамораспаковывающийся jar-файл — хороший механизм распространения файлов на различных платформах. Самораспаковывающиеся jar-архивы просто создавать, и минимальное требование к пользователю установить JRE 1.2 или более позднюю версию — разумный компромисс, позволяющий получить кросс-платформенную поддержку. Вместо создания самораспаковывающегося jar-файла вручную испытайте ZipAnywhere . ZipAnywhere — полнофункциональная zip/jar-утилита, написанная на 100% чистой Java. Это — свободно распространяемый инструмент с графическим интерфейсом типа WinZip, который позволяет создавать самораспаковывающиеся jar-файлы одним щелчком кнопки. Об авторахДоктор Зунх Стив Джин — инженер-программист в Rational Software и автор ZipAnywhere . Джон Д. Митчелл — редактор и автор колонки Tips 'N Tricks в JavaWorld . Джон также основатель и главный архитектор Non, Inc. , консультационной фирмы по управлению технологическими деловыми рисками. Ресурсы
Reprinted with permission from the January 2001 edition of JavaWorld magazine. Copyright © ITworld.com, Inc., an IDG Communications company. Source: http://www.javaworld.com/jw-01-2001/jw-0119-jspframe.html | |
| |
Views: 5754 | |