28 апреля 2012 г.

Автоматическое создание Runnable JAR в Eclipse и ресурсы

Когда разрабатывается относительно небольшое десктопное приложение на Java, частенько возникает вполне, на мой взгляд, естественное желание запихать все классы, библиотеки и ресурсы в один исполняемый JAR-файл. В некоторых случаях именно такое решение является предпочтительным.

В Eclipse IDE это можно сделать очень легко и, кроме того, автоматизировать это действие, чтобы в дальнейшем делать сборку JAR одной кнопкой.

Сборка 

Кликаем правой кнопкой по проекту, который надо упаковать в исполняемый JAR и нажимаем Export.

В окне выбираем Java -> Runnable JAR и жмём Next


Теперь настраиваем параметры создания JAR:
  1. Конфигурация запуска (Launch configuration или Run configuration), которая отвечает за запуск проекта. Из неё во время сборки будет взята информация о Main class, CLASSPATH и всех необходимых библиотеках
  2. Имя создаваемого JAR-файла
  3. Далее надо указать, как следует поступить с подключенными библиотеками:
    • Распаковать содержимое библиотек и запаковать и вместе с вашими классами и ресурсами в один JAR
    • Не распаковывая положить все библиотеки в создаваемый JAR. В дополнение к этому Eclipse положит в build-катлог файл jar-in-jar-loader.zip, который содержит классы, позволяющие использовать эти "дважды упакованные" библиотеки вашему приложению (Classloader). Эти классы будут также упакованы в ваш JAR и, следовательно, для его выполнения после окончательной сборки архив jar-in-jar-loader.zip не нужен. Однако, для того чтобы можно было автоматизировать такую сборку, этот архив обязательно должен быть в build-каталоге, поэтому после первой "кнопочно-окошечной" сборки его удалять не стоит
    • Положить все необходимые библиотеки в каталог рядом с созданным JAR'ом
  4. Можно указать где сохранить сгенерированный Ant-скрипт для этой сборки. В дальнейшем его можно будет использовать для автоматизации процесса создания исполняемого JAR-файла из проекта

При создании JAR, автоматом также будет создан файл MANIFEST.MF с правильными Class-Path и Main-Class, поэтому ваш архив можно будет запустить простой командой java -jar application.jar.

Если вы решите упаковывать все библиотеки в один JAR вместе с вашими классами, убедитесь, что лицензии библиотек это разрешают.

Автоматизация сборки

Как было сказано ранее, при создании JAR с помощью Eclipse, вы можете сохранить сгенерированный скрипт Ant, содержащий все необходимые действия.

В свойствах проекта (Project -> Properties) есть раздел Builders, в котором вы можете создавать дополнительные билдеры и в частности таким билдером может быть Ant, которому вы и подсовываете этот файл. После этого при каждом запуске проекта (Ctrl + F11), JAR будет собираться автоматически, если были изменения в исходном коде.


Такой вариант постоянной сборки JAR не особо удобен, т.к. может занимать некомфортное по продолжительности время. Вместо этого можно создать этот билдер в External Tools (Run -> External Tools -> External Tools Configurations) и запускать сборку JAR только, когда вам это действительно нужно.


Ну и, конечно же, никто не запрещает вам добавлять свои собственные цели и задачи в этот Ant-скрипт. Подробнее об Ant'е я писал тут.

Ресурсы

Кроме скомпилированных классов, в JAR также можно хранить и другие ресурсы приложения, например, текстовые файлы или картинки. Для этого нужно поместить ресурсы в пакет (или субпакет) с каким-нибудь классом и использовать методы Class.getResource(String name) или Class.getResourceAsStream(String name) для доступа к ресурсу. Параметр name это имя файла ресурса относительно каталога (пакета), в котором лежит класс.

Пример

У вас есть класс MyApp.class, который находится в пакете my.application. Вы можете поместить файлы изображений например в my.application.images и обращаться к ним из класса MyApp примерно так:
URL url = getClass().getResource("images/my_picture.png");        
Image image = Toolkit.getDefaultToolkit().getImage(url);
Или из любого другого класса:
URL url = MyApp.class.getResource("images/my_picture.png");        
Image image = Toolkit.getDefaultToolkit().getImage(url);

При использовании такого подхода, можно получать доступ как к незапакованным файлам ресурсов, так и к тем, которые запакованы в JAR вместе с классами.








Комментариев нет:

Отправить комментарий