Логин:   Пароль:






Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100
Rambler's Top100

Java: СтатьиСамораспаковывающиеся jar-файлы

Самораспаковывающиеся jar-файлы

Создавайте удобные в использовании кросс-платформенные Java-архивы.

Обзор

В этой статье описан простой способ создания самораспаковывающихся Java-архивов (jar-файлов). Самораспаковывающийся архив может извлекать содержащиеся в нём файлы в выбранные пользователем каталоги на любой платформе Java. Пользователям нужна только среда выполнения Java-программ. (В оригинальной версии на английском языке 1200 слов)

Многие годы 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 следует за основным форматом:

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

В случае программы-распаковщика 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 , Вы можете предпринять следующие шаги, чтобы создать из него самораспаковывающийся файл:

  1. Перейдите в каталог, содержащий myzip.zip .
  2. Загрузите zipper.jar .
  3. Извлеките файлы в текущий каталог. Мы сделали этот jar-архив самораспаковывающимся.
    java -jar zipper.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-программ (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.
View the original article at: http://www.javaworld.com/jw-01-2001/jw-0119-jspframe.html

З. Стив Джин, Джон Д. Митчелл
Перевод на русский © Дмитрий Габинский, 2003

Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95