Как да създадете изпълним JAR с Maven

1. Въведение

В тази бърза статия ще се съсредоточим върху опаковането на проект на Maven в изпълним Jar файл .

Обикновено, когато създаваме jar файл, искаме да го изпълним лесно, без да използваме IDE; за тази цел ще обсъдим конфигурацията и плюсовете / минусите на използването на всеки от тези подходи за създаване на изпълнимия файл.

2. Конфигурация

За да създадем изпълним буркан , нямаме нужда от допълнителни зависимости. Просто трябва да създадем проект на Maven Java и да имаме поне един клас с метода main (...) .

В нашия пример създадохме Java клас с име ExecutableMavenJar.

Също така трябва да се уверим, че нашият pom.xml съдържа следните елементи:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Най-важният аспект тук е типът - за да създадете изпълним буркан , двойна проверка на конфигурацията използва тип буркан .

Сега можем да започнем да използваме различните решения.

2.1. Ръчна конфигурация

Нека започнем с ръчен подход - с помощта на приставката maven-зависимост .

Първо ще копираме всички необходими зависимости в папката, която ще посочим:

 org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies    ${project.build.directory}/libs     

Има два важни аспекта, които трябва да забележите. Първо, ние посочваме целевите зависимости , които казват на Maven да копира тези зависимости в посочения outputDirectory .

В нашия случай ще създадем папка с име libs в директорията за изграждане на проекта (която обикновено е целевата папка).

Във втората стъпка ще създадем изпълним и осъзнат път на класа буркан с връзката към зависимостите, копирани в първата стъпка:

 org.apache.maven.plugins maven-jar-plugin    true libs/  com.baeldung.executable.ExecutableMavenJar     

Най-важната част от гореспоменатото е конфигурацията на манифеста . Добавяме път на класа с всички зависимости (папки libs / ) и предоставяме информацията за основния клас.

Моля, обърнете внимание, че трябва да предоставим напълно квалифицирано име на класа, което означава, че ще включва име на пакета.

Предимствата и недостатъците на този подход са:

  • плюсове - прозрачен процес, където можем да посочим всяка стъпка
  • минуси - ръчно, зависимостите са извън окончателния jar , което означава, че изпълнимият ви jar ще работи само ако папката libs ще бъде достъпна и видима за jar

2.2. Приставка за сглобяване на Apache Maven

Плъгинът за сглобяване Apache Maven позволява на потребителите да обобщават изхода на проекта заедно с неговите зависимости, модули, документация на сайта и други файлове в един, изпълним пакет.

Основната цел в приставката за сглобяване е единичната цел - използва се за създаване на всички сглобки (всички останали цели са оттеглени и ще бъдат премахнати в бъдещо издание).

Нека да разгледаме конфигурацията в pom.xml :

 org.apache.maven.plugins maven-assembly-plugin   package  single      com.baeldung.executable.ExecutableMavenJar     jar-with-dependencies     

Подобно на ръчния подход, ние трябва да предоставим информация за основния клас; разликата е, че Maven Assembly Plugin автоматично ще копира всички необходими зависимости в jar файл.

В частта descriptorRefs на конфигурационния код предоставихме името, което ще бъде добавено към името на проекта.

Изходът в нашия пример ще бъде наречен като core-java-jar-with-dependencies.jar.

  • плюсове - зависимости в jar файла, само за един файл
  • минуси - основен контрол върху опаковането на вашия артефакт, например няма поддръжка на преместване на класа

2.3. Приставка за сянка на Apache Maven

Apache Maven Shade Plugin предоставя възможност за пакетиране на артефакта в uber-jar , който се състои от всички зависимости, необходими за стартиране на проекта. Освен това той поддържа засенчване - т.е. преименуване - на пакетите на някои от зависимостите.

Нека да разгледаме конфигурацията:

 org.apache.maven.plugins maven-shade-plugin    shade   true   com.baeldung.executable.ExecutableMavenJar      

Има три основни части на тази конфигурация:

Първо, маркира всички зависимости, които трябва да бъдат пакетирани в буркана .

Второ, трябва да уточним изпълнението на трансформатора; използвахме стандартния в нашия пример.

И накрая, трябва да посочим основния клас на нашето приложение.

Изходният файл ще бъде наречен core-java-0.1.0-SNAPSHOT-shaded.jar , където core-java е името на нашия проект, последвано от версия на снимка и име на приставка.

  • плюсове - зависимости вътре в jar файла, усъвършенстван контрол на опаковането на вашия артефакт, със засенчване и преместване на класа
  • минуси - сложна конфигурация (особено ако искаме да използваме разширени функции)

2.4. Приставка за един буркан Maven

Друга възможност за създаване на изпълним буркан е проектът One Jar.

Това осигурява персонализиран loadloader, който знае как да зарежда класове и ресурси от буркани в архив, вместо от буркани във файловата система.

Нека да разгледаме конфигурацията:

 com.jolira onejar-maven-plugin    org.baeldung.executable. ExecutableMavenJar true  ${project.build.finalName}.${project.packaging}    one-jar    

Както е показано в конфигурацията, трябва да посочим основния клас и да прикачим всички зависимости за изграждане, като използваме attachToBuild = true .

Also, we should provide the output filename. Moreover, the goal for Maven is one-jar. Please note, that One Jar is a commercial solution, that will make dependency jars not expanded into the filesystem at runtime.

  • pros – clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
  • cons – not actively supported since 2012

2.5. Spring Boot Maven Plugin

Finally, the last solution we'll look at is the Spring Boot Maven Plugin.

This allows to package executable jar or war archives and run an application “in-place”.

To use it we need to use at least Maven version 3.2. The detailed description is available here.

Let's have a look at the config:

 org.springframework.boot spring-boot-maven-plugin    repackage   spring-boot  com.baeldung.executable.ExecutableMavenJar     

There are two differences between Spring plugin and the others. First, the goal of the execution is called repackage, and the classifier is named spring-boot.

Please note, that we don't need to have Spring Boot application in order to use this plugin.

  • pros – dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well
  • cons – adds potentially unnecessary Spring and Spring Boot related classes

2.6. Web Application With Executable Tomcat

In the last part, we want to cover the topic of having a standalone web application, that is packed inside a jar file. In order to do that, we need to use different plugin, designed for creating executable jar files:

 org.apache.tomcat.maven tomcat7-maven-plugin 2.0   tomcat-run  exec-war-only  package  / false webapp.jar utf-8    

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

  • pros – having one file, easy to deploy and run
  • cons – a size of the file is much larger, due to packing Tomcat embedded distribution inside a war file

Please note, that this is the latest version of this plugin, which supports Tomcat7 server. To avoid errors, please check that your dependency for Servlets has scope set as provided, otherwise, there will be a conflict at the runtime of executable jar:

 javax.servlet javax.servlet-api provided 

3. Conclusion

В тази статия описахме много начини за създаване на изпълним буркан с различни плъгини Maven.

Пълното изпълнение на този урок може да се намери в този (изпълним буркан) и този (изпълним война) Github проекти.

Как да тествате? За да компилирате проекта в изпълним буркан , моля, стартирайте Maven с командата mvn clean package .

Надяваме се, че тази статия ви дава още някои прозрения по темата и ще намерите предпочитания от вас подход в зависимост от вашите нужди.

Една бърза последна бележка - уверете се, че лицензите на бурканите, които комплектувате, не забраняват този вид операции. Като цяло това няма да е така, но си заслужава да се обмисли.