Как создать исполняемый JAR с Maven
1. Вступление
В этой быстрой статье мы сосредоточимся наpackaging a Maven project into an executable Jar file.
Обычно при создании файлаjar мы хотим выполнить его легко, без использования IDE; с этой целью мы обсудим конфигурацию и плюсы / минусы использования каждого из этих подходов для создания исполняемого файла.
Дальнейшее чтение:
Учебник по Apache Maven
Краткое и практическое руководство по созданию и управлению проектами Java с использованием Apache Maven.
Где находится Maven Local Repository?
Краткое руководство, показывающее, где Maven хранит свои локальные репозитории и как это изменить.
Весна с Maven BOM
Узнайте, как использовать спецификацию, спецификацию в своем проекте Spring Maven.
2. конфигурация
Чтобы создать исполняемый файлjar, нам не нужны дополнительные зависимости. Нам просто нужно создать проект Maven Java и иметь хотя бы один класс с методомmain(…).
В нашем примере мы создали класс Java с именемExecutableMavenJar.
Нам также необходимо убедиться, что нашpom.xml содержит следующие элементы:
4.0.0
com.example
core-java
0.1.0-SNAPSHOT
jar
Наиболее важным аспектом здесь является тип - чтобы создать исполняемый файлjar, дважды проверьте, что конфигурация использует типjar.
Теперь мы можем начать использовать различные решения.
2.1. Ручная настройка
Начнем с ручного подхода - с помощьюmaven-dependency-plugin.
Сначала мы скопируем все необходимые зависимости в указанную нами папку:
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
prepare-package
copy-dependencies
${project.build.directory}/libs
Следует обратить внимание на два важных аспекта. Сначала мы указываем цельcopy-dependencies, которая указывает Maven копировать эти зависимости в указанныйoutputDirectory.
В нашем случае мы создадим папку с именемlibs внутри каталога сборки проекта (обычно это папкаtarget).
На втором этапе мы собираемся создать исполняемый файл и путь к классуjar, со ссылкой на зависимости, скопированной на первом этапе:
org.apache.maven.plugins
maven-jar-plugin
true
libs/
org.example.executable.ExecutableMavenJar
Самая важная часть вышеупомянутого - это конфигурацияmanifest. Мы добавляем путь к классам со всеми зависимостями (папкаlibs/) и предоставляем информацию об основном классе.
Обратите внимание, что нам нужно предоставить полностью определенное имя класса, что означает, что он будет включать имя пакета.
Преимущества и недостатки этого подхода:
-
pros - прозрачный процесс, где мы можем указать каждый шаг
-
cons - вручную, зависимости выходят за пределы окончательногоjar, что означает, что ваш исполняемый файлjar будет запускаться только в том случае, если папкаlibs будет доступна и видна дляjarс
2.2. Сборочный плагин Apache Maven
Плагин сборки Apache Maven позволяет пользователям объединять выходные данные проекта вместе с его зависимостями, модулями, документацией сайта и другими файлами в один работающий пакет.
Основная цель плагина сборки - это цельsingle - используется для создания всех сборок (все другие цели устарели и будут удалены в следующем выпуске).
Давайте посмотрим на конфигурацию вpom.xml:
org.apache.maven.plugins
maven-assembly-plugin
package
single
org.example.executable.ExecutableMavenJar
jar-with-dependencies
Как и при ручном подходе, нам нужно предоставить информацию об основном классе; разница в том, что плагин сборки Maven автоматически копирует все необходимые зависимости в файлjar.
В части кода конфигурацииdescriptorRefs мы указали имя, которое будет добавлено к имени проекта.
Выход в нашем примере будет называтьсяcore-java-jar-with-dependencies.jar.
-
pros - зависимости внутри файлаjar, только однофайловые
-
cons - базовый контроль упаковки вашего артефакта, например, нет поддержки перемещения класса
2.3. Плагин Apache Maven Shade
Плагин Apache Maven Shade предоставляет возможность упаковать артефакт вuber-jar, который состоит из всех зависимостей, необходимых для запуска проекта. Более того, он поддерживает затенение - т.е. переименовать - пакеты некоторых зависимостей.
Давайте посмотрим на конфигурацию:
org.apache.maven.plugins
maven-shade-plugin
shade
true
org.example.executable.ExecutableMavenJar
Есть три основные части этой конфигурации:
Во-первых,<shadedArtifactAttached> отмечает все зависимости, которые должны быть упакованы вjar.
Во-вторых, нам нужно указатьthe transformer implementation; в нашем примере мы использовали стандартный.
Наконец, нам нужно указать основной класс нашего приложения.
Выходной файл будет называтьсяcore-java-0.1.0-SNAPSHOT-shaded.jar, гдеcore-java - это имя нашего проекта, за которым следует версия моментального снимка и имя плагина.
-
pros - зависимости внутри файлаjar, расширенный контроль упаковки вашего артефакта, с затенением и перемещением класса
-
cons - сложная конфигурация (особенно если мы хотим использовать расширенные функции)
2.4. Плагин One Jar Maven
Другой вариант создания исполняемого файлаjar - это проект One Jar.
Это предоставляет настраиваемый загрузчик классов, который знает, как загружать классы и ресурсы из jar-файлов внутри архива, а не изjars в файловой системе.
Давайте посмотрим на конфигурацию:
com.jolira
onejar-maven-plugin
org.example.executable.
ExecutableMavenJar
true
${project.build.finalName}.${project.packaging}
one-jar
Как показано в конфигурации, нам нужно указать основной класс и присоединить все зависимости для сборки, используяattachToBuild= true.
Кроме того, мы должны предоставить выходное имя файла. Более того, цель Maven -one-jar. Обратите внимание, что One Jar - это коммерческое решение, в котором зависимостьjars не будет расширяться в файловую систему во время выполнения.
-
pros - чистая модель делегирования, позволяет классам находиться на верхнем уровне One Jar, поддерживает внешниеjars и может поддерживать собственные библиотеки
-
cons - активно не поддерживается с 2012 г.
2.5. Spring Boot Maven Плагин
Наконец, последнее решение, которое мы рассмотрим, - это подключаемый модуль Spring Boot Maven.
Это позволяет упаковать исполняемые архивыjar илиwar и запустить приложение «на месте».
Для его использования нам нужно использовать как минимум Maven версии 3.2. Подробное описание доступноhere.
Посмотрим на конфигурацию:
org.springframework.boot
spring-boot-maven-plugin
repackage
spring-boot
org.example.executable.ExecutableMavenJar
Есть два различия между плагином Spring и другими. Во-первых, цель выполнения называетсяrepackage, а классификатор -spring-boot.
Обратите внимание, что нам не нужно иметь приложение Spring Boot, чтобы использовать этот плагин.
-
pros - зависимости внутри файлаjar, вы можете запускать его в любом доступном месте, расширенный контроль упаковки вашего артефакта, с исключением зависимостей из файлаjar и т. д., упаковкаwar файлы
-
cons - добавляет потенциально ненужные классы, связанные с Spring и Spring Boot
2.6. Веб-приложение с исполняемым Tomcat
В последней части мы хотим затронуть тему автономного веб-приложения, которое упаковано в файл jar. Для этого нам нужно использовать другой плагин, предназначенный для создания исполняемых jar-файлов:
org.apache.tomcat.maven
tomcat7-maven-plugin
2.0
tomcat-run
exec-war-only
package
/
false
webapp.jar
utf-8
goal устанавливается какexec-war-only,path для вашего сервера указывается внутри тегаconfiguration с дополнительными свойствами, такими какfinalName, charset и т. Д. Чтобы построить jar, запуститеman package, что приведет к созданиюwebapp.jar в вашем каталогеtarget. Бежать
Чтобы запустить приложение, просто напишите это в консоли:java -jar target/webapp.jar и попробуйте протестировать его, указавlocalhost:8080 / в браузере.
-
pros - один файл, легко развернуть и запустить
-
cons - размер файла намного больше из-за упаковки встроенного дистрибутива Tomcat в файл war
Обратите внимание, что это последняя версия этого плагина, которая поддерживает сервер Tomcat7. Чтобы избежать ошибок, убедитесь, что в вашей зависимости для сервлетовscope задано какprovided, в противном случае возникнет конфликт вruntime исполняемого файлаjar:
javax.servlet
javax.servlet-api
provided
3. Заключение
В этой статье мы описали множество способов создания исполняемого файлаjar с помощью различных плагинов Maven.
Полную реализацию этого руководства можно найти в проектах Githubthis (executable jar) иthis (executable war).
How to test? Чтобы скомпилировать проект в исполняемый файлjar, запустите Maven с командойmvn clean package.
Надеемся, что эта статья даст вам больше понимания этой темы, и вы найдете предпочтительный подход в зависимости от ваших потребностей.
Одно быстрое заключительное замечание: убедитесь, что лицензии объединяемых вами jar-файлов не запрещают такого рода операции. Как правило, это не так, но над этим стоит подумать.