Как получить jar файл
Содержание
- Введение
- Конфигурация
- Ручная настройка
- Apache Maven Assembly Plugin
- Apache Maven Shade Plugin
- One Jar Maven Plugin
- Плагин Spring Boot Maven
- Веб-приложение с исполняемым Tomcat
- Заключение
- 2 ответа 2
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками java или задайте свой вопрос.
- Похожие
- Об этом цикле статей
- Сохранение в JAR
- Листинг 1. Архивирование утилиты консоли
- 1. JAR-файлы исполняемы
- Развить навыки по этой теме
- Листинг 2. Указание точки входа
- Листинг 3. Создание точки входа
- 2. JAR-файлы могут включать сведения о зависимостях
- Листинг 4. Hello, мир Spring!
- Подробнее о Spring
- Листинг 5. Hello, Spring >
- 3. На JAR-файлы можно ссылаться неявно
- 4. Java 6 допускает подстановочные знаки в classpath
- 5. JAR- файлы содержат не только код
- Листинг 6. Произвольный ответ
- Листинг 7. >
- Заключение
Введение
В этой статье мы рассмотрим упаковку Maven- проекта в файл Jar . Выясним преимущества и недостатки каждого из подходов, применяемых для создания исполняемого файла.
Конфигурация
Чтобы создать исполняемый файл jar , не требуются дополнительные зависимости. Нам нужно просто создать Java-проект Maven с одним классом и методом main(…) .
В приведенном ниже примере мы создаем Java-класс ExecutableMavenJar. Для этого в файл pom.xml нужно добавить следующие элементы:
Удостоверьтесь в том, что в конфигурации задан тип jar . Теперь можно приступить к реализации каждого из подходов.
Ручная настройка
Для этого мы используем плагин maven-dependency-plugin . Сначала скопируем все необходимые зависимости в указанную папку:
Сначала мы задаем цель copy-dependencies , что указывает Maven скопировать эти зависимости в заданный outputDirectory .
В данном случае мы создадим папку с именем libs внутри каталога сборки проекта (обычно это папка target ).
Затем мы создаем исполняемый файл jar с указанными путями к классам и со ссылкой на зависимости, скопированные на первом шаге:
Наиболее важной частью приведенного выше кода является конфигурация manifest . В ней мы добавляем classpath со всеми зависимостями (папка libs/ ), а также предоставляем информацию о главном классе.
Преимущества и недостатки этого подхода:
- Преимущества — прозрачный процесс, в рамках которого можно прописать каждый шаг.
- Недостатки — зависимости находятся вне финального файла jar . Поэтому он будет работать только, если папка libs будет доступна и видима для jar-файла.
Apache Maven Assembly Plugin
Плагин Apache Maven Assembly позволяет объединять выходные данные проекта вместе с зависимостями, модулями, документацией и другими файлами в единый пакет.
Основной целью в плагине сборки является single . Она используется для создания любых сборок. Остальные цели устарели и будут удалены в следующей версии плагина.
Рассмотрим конфигурацию, заданную в файле pom.xml :
Как и при ручной настройке, сначала нужно предоставить информацию о главном классе. Но плагин автоматически скопирует все необходимые зависимости в файл JAR .
В descriptorRefs мы указали имя, которое будет добавлено к имени проекта. В нашем случае – это core-java-jar-with-dependencies.jar.
- Преимущества – зависимости хранятся внутри jar -файла.
- Недостатки — упрощенный контроль упаковки артефакта. Например, нет поддержки перемещения классов.
Apache Maven Shade Plugin
Плагин позволяет упаковывать артефакт в uber-jar , который включает в себя все зависимости, необходимые для запуска проекта. Кроме того, он поддерживает переименование пакетов некоторых зависимостей.
Рассмотрим приведенную ниже конфигурацию:
В этой конфигурации отмечает все зависимости, которые должны быть упакованы в файл jar .
Затем нам нужно указать реализацию трансформатора . В текущем примере мы использовали стандартную версию. В конце задаем основной класс приложения.
Выходной файл получит название core-java-0.1.0-SNAPSHOT-shaded.jar , где core-java — это имя проекта. За ним следуют версия и имя плагина.
- Преимущества — зависимости внутри jar- файла, расширенный контроль упаковки артефакта.
- Недостатки — сложная конфигурация (особенно если необходимо использовать расширенные функции).
One Jar Maven Plugin
Плагин предоставляет собственный загрузчик, который знает, как загружать классы и ресурсы из jar-файлов архива.
Рассмотрим приведенную ниже конфигурацию:
Сначала необходимо указать основной класс и прикрепить все зависимости сборки, используя для этого attachToBuild = true .
Также необходимо задать имя файла для вывода. Цель Maven — это one-jar .
В One Jar зависимости jar не будут расширены в файловую систему во время выполнения.
- Преимущества — позволяет классам располагаться на верхнем уровне One Jar. Плагин поддерживает внешние jar и собственные библиотеки.
- Недостатки – не обновляется с 2012 года.
Плагин Spring Boot Maven
Плагин позволяет упаковывать исполняемые архивы jar или war и запустить приложение «на месте». Он поддерживает Maven версии 3.2 или выше. Более подробное описание плагина доступно здесь .
Рассмотрим приведенную ниже конфигурацию:
Между Spring и другими плагинами есть два существенных отличия: цель выполнения называется repackage , а классификатор — spring-boot . Обратите внимание, что плагин можно использовать без Spring Boot.
- Достоинства – зависимости располагаются внутри jar- файла, его можно запускать в любом доступном месте, улучшенный контроль упаковки артефакта, исключение зависимостей из jar- файла и упаковка war файлов.
- Недостатки — добавляет ненужные классы, связанные с Spring и Spring Boot.
Веб-приложение с исполняемым Tomcat
В последней части статьи мы рассмотрим упаковку автономного веб-приложения в jar -файл. Но для этого понадобится другой плагин.
Чтобы создать jar-файл, запустите man package, который создаст webapp.jar в каталоге target.
Чтобы запустить приложение, просто введите в консоли: java -jar target / webapp.jar и проверьте результат по адресу: localhost:8080/.
- Преимущества — наличие одного файла, простота развертывания и запуска.
- Недостатки — размер файла намного больше.
Обратите внимание на то, что это последняя версия данного плагина, поддерживающая сервер Tomcat7. Чтобы избежать ошибок, обязательно убедитесь в том, что для зависимости Servlets scope задано значение provided. Иначе во время выполнения jar-файла возникнет конфликт:
Заключение
В этой статье мы рассмотрели несколько способов создания исполняемого jar-файла с помощью различных плагинов Maven. Полную реализацию этого руководства вы сможете найти в проектах, опубликованных на Github:
Как проверить? Чтобы скомпилировать проект в исполняемый файл jar , запустите Maven с помощью команды mvn clean package .
Надеемся, что данная статья помогла разобраться в этой теме.
Данная публикация представляет собой перевод статьи « How to Create an Executable JAR with Maven » , подготовленной дружной командой проекта Интернет-технологии.ру
Как с помощью java получить File которые находятся в директории, а директория находится в собственном jar? Вот как я получаю ссылки
Пробую получить список файлов через File[] fil = defaultThemeFile.listFiles(); Но всегда fil равен null . И чтобы работало на операционных системах Linux and Windows .
2 ответа 2
Можно получить файл как массив байтов.
Можно воспользоваться новым api java.nio.file , т.к. есть реализация FileSystemProvider для zip-файлов.
Для работы нужно получить адрес jar-файла примерно такого вида: jar:file:/E:/eclipse-workspace/sandbox/sandbox.jar . Для текущего класса нужный URI можно получить вызовом:
Дальше с помощью этого URI нужно получить объект FileSystem и работать с ним с помощью нового api:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками java или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459
Архив Java — это не просто набор классов
Для большинства Java-разработчиков JAR-файлы и их специализированные собратья WAR- и EAR-файлы — это просто конечный результат длительного процесса работы в Ant или Maven. Стандартная процедура ― скопировать JAR в нужное место на сервере (или, реже, в компьютере пользователя) и забыть о нем.
На самом деле, JAR-файлы годятся не только для того, чтобы хранить исходный код. Просто нужно знать их возможности и способы реализации этих возможностей. Советы, приведенные в этом выпуске Пяти секретов, помогут выжать максимум из файлов архива Java (а в некоторых случаях также и файлов WAR/EAR), особенно в процессе развертывания.
В силу того, что многие Java-разработчики используют Spring (а также поскольку среда Spring представляет некоторые проблемы для традиционного использования JAR-файлов), некоторые из советов специально относятся к JAR-файлам в приложениях Spring.
Об этом цикле статей
Вы думаете, что знаете о Java-программировании все? На самом деле большинство разработчиков только скребет по поверхности платформы Java, изучив ее лишь настолько, чтобы выполнять свою работу. В этом цикле статей Тед Ньюард углубляется в функциональные возможности платформы Java, выявляя малоизвестные факты, которые могут помочь в решении самых заковыристых задач программирования.
Я начну с краткого примера стандартной процедуры работы с файлами Java Archive, которая будет служить основой для последующих советов.
Сохранение в JAR
Как правило, JAR-файл создают после компиляции исходного кода, чтобы собрать Java-код (который отделен от пакета) в одну коллекцию с помощью утилиты командной строки jar или, чаще, задачи jar Ant. Этот процесс достаточно прост, так что я не буду демонстрировать его здесь, хотя позже мы вернемся к теме конструкции JAR-файлов. Пока же нам просто нужно заархивировать Hello , отдельную утилиту консоли, которая решает невероятно полезную задачу вывода сообщения на консоль, как показано в листинге 1.
Листинг 1. Архивирование утилиты консоли
Утилита Hello делает не много, но это полезный пример для изучения JAR-файлов, начиная с выполнения кода.
1. JAR-файлы исполняемы
Развить навыки по этой теме
Этот материал — часть knowledge path для развития ваших навыков. Смотри Стать Java-разработчиком
Исторически языки типа.NET и C++ обладают преимуществом дружественного отношения к ОС: чтобы запустить приложение, достаточно просто набрать его имя в командной строке ( helloWorld.exe ) или дважды щелкнуть на соответствующий значок в оболочке графического интерфейса пользователя (GUI). В Java-программировании модуль запуска приложения — java — загружает в процесс JVM, и ему нужно передать аргумент командной строки ( com.tedneward.Hello ), указывающий класс, метод main() которого мы хотим запустить.
Эти дополнительные шаги затрудняют создание удобных для пользователя приложений на языке Java. Все эти элементы нужно набрать в командной строке, чего многие конечные пользователи стараются избегать, и очень часто что-то выходит не так, и это приводит к странным сообщениям об ошибке.
От этого можно уйти, сделав JAR-файл «исполняемым», так чтобы при его выполнении модуль запуска Java автоматически узнавал, какой класс нужно запустить. Для этого достаточно ввести в манифест JAR-файла ( MANIFEST.MF в подкаталоге архива JAR META-INF ) следующую запись.
Листинг 2. Указание точки входа
Манифест ― это просто набор пар имя/значение. Иногда манифест может придираться к символам пробела и возврата строки, так что простейший способ ― использовать для его создания Ant. В листинге 3 для определения манифеста применяется элемент manifest задачи Ant jar .
Листинг 3. Создание точки входа
Теперь, чтобы выполнить JAR-файл, пользователю достаточно ввести его имя в командную строку посредством команды java -jar outapp.jar . В некоторых GUI-оболочках это можно сделать и двойным щелчком на JAR-файле.
2. JAR-файлы могут включать сведения о зависимостях
С ростом популярности утилиты Hello возникла необходимость варьировать ее реализацию. Многими деталями этого процесса управляют контейнеры инъекции зависимостей (Dependency Injection — DI), такие как Spring или Guice, но есть одно "но": изменение кода для включения контейнера DI может привести к результатам, подобным тому, что приведен в листинге 4.
Листинг 4. Hello, мир Spring!
Подробнее о Spring
Этот совет предполагает знакомство с инъекцией зависимостей и средой Spring. Чтобы освежить свои знания в той или другой области, обращайтесь к разделу Ресурсы.
Параметр -jar модуля запуска отменяет все, что находиться в параметре -classpath командной строки, поэтому при запуске этого кода Spring должен присутствовать в CLASSPATH и в переменной окружения. К счастью, JAR-файлы допускают объявление в манифесте других JAR-зависимостей, которые неявно создают CLASSPATH без необходимости объявлять его, как показано в листинге 5.
Листинг 5. Hello, Spring >
Обратите внимание, что атрибут Class-Path содержит относительную ссылку на JAR-файлы, от которых зависит приложение. Это можно написать в виде абсолютной ссылки или вообще без префикса, в предположении, что JAR-файлы находятся в том же каталоге, что и JAR приложения.
К сожалению, атрибут value Ant-атрибута Class-Path должен находиться в той же строке, поскольку манифест JAR не может работать с множественными атрибутами Class-Path . Так что все эти зависимости должны находиться в одной строке файла манифеста. Конечно, это некрасиво, но возможность написать java -jar outapp.jar того стоит!
3. На JAR-файлы можно ссылаться неявно
Когда есть несколько различных утилит командной строки (или других приложений), использующих среду Spring, удобно поместить JAR-файлы Spring в общую папку, посредством которой можно ссылаться на все эти утилиты. Это позволит избежать работы с несколькими копиями JAR-файлов, разбросанными по всей файловой системе. По умолчанию таким местом служит обычное местоположение среды выполнения Java для JAR-файлов, т.н. «каталог расширения», который находится в подкаталоге lib/ext каталога установки JRE.
Местоположение JRE можно изменять, но это делают так редко, так что для данной среды Java можно вполне безопасно предположить, что lib/ext — надежное место хранения JAR-файлов и что они будут неявно присутствовать в CLASSPATH среды Java.
4. Java 6 допускает подстановочные знаки в classpath
Во избежание громоздких переменных окружения CLASSPATH (от которых Java-разработчикам следовало бы отказаться много лет назад) и/или параметров командной строки -classpath в Java 6 введено понятие подстановочный знак classpath. Вместо того чтобы запускать каждый JAR-файл, явно указанный в аргументе, подстановочные знаки classpath позволяют написать lib/* , и в classpath попадут все JAR-файлы, перечисленные в этом каталоге (не рекурсивно).
К сожалению, подстановочные знаки classpath не поддерживаются в записи атрибута Class-Path манифеста, о которой говорилось выше. Но они облегчают запуск Java-приложений (включая серверы) при решении таких задач, как работа с инструментами генерации или анализа кода.
5. JAR- файлы содержат не только код
Spring, как и многие другие составляющие экосистемы Java, зависит от файла конфигурации, определяющего организацию среды. А именно, Spring зависит от файла app.xml, который находится в том же каталоге, что и файл JAR — но разработчики часто забывают скопировать вместе с JAR-файлом файл конфигурации.
Некоторые файлы конфигурации редактируются системным администратором, но значительное их число (например, состав библиотеки Hibernate) находятся вне его ведения, что приводит к ошибкам при развертывании. Разумное решение ― упаковать файл конфигурации вместе с кодом — и это выполнимо, потому что JAR ― это в основном замаскированный ZIP. Просто при построении JAR включите файлы конфигурации в Ant-задачу или командную строку jar .
JAR-файлы могут содержать не только файлы конфигурации, но и файлы других типов. Например, если бы мой компонент SpeakEnglish должен был бы обращаться к файлу свойств, я бы сделал это примерно так, как показано в листинге 6.
Листинг 6. Произвольный ответ
Помещение responses.properties в JAR-файл означает, что файлов, о которых придется беспокоиться при развертывании наряду с JAR-файлами, стало на один меньше. Для этого достаточно включить файл responses.properties при создании JAR.
Однако как получить те свойства, которые хранятся в JAR-файле, назад? Если нужные данные расположены внутри одного и того же JAR-файла, как в предыдущем примере, не обязательно пытаться вспомнить местоположение этого JAR-файла и открывать его с помощью объекта JarFile . Вместо этого предоставьте ClassLoader данного класса найти его в качестве «ресурса» в составе JAR-файла, воспользовавшись методом ClassLoader getResourceAsStream() , как показано в листинге 7.
Листинг 7. >
Эта процедура работает с ресурсами любого рода: файлами конфигурации, аудиофайлами, графическими файлами и т.п. Файл практически любого типа можно поместить в JAR, полученный как InputStream (посредством ClassLoader ), и использовать любым способом.
Заключение
Эта статья раскрывает пять секретов JAR-файлов, обычно скрытых от большинства Java-разработчиков — по крайней мере, если основаться на истории и случаях из жизни. Отметим, что все советы, относящиеся к JAR-файлам, в полной мере справедливы и для WAR-файлов. Некоторые из них (в частности, атрибуты Class-Path и Main-Class ), в случае WAR-файлов не так полезны, потому что среда сервлетов сама собирает все содержимое каталога и имеет предопределенную точку входа. Тем не менее, взятые в совокупности, эти советы выводят нас за рамки парадигмы «Начнем с копирования всего в этот каталог. » При этом они значительно упрощают и процесс развертывания Java-приложений.
Следующая статья этого цикла: "Пять секретов контроля производительности Java-приложений".