Использовать «maven-shade-plugin», чтобы создать только 1 исполняемый файл jar со всеми необходимыми зависимостями для вашего проекта Java или Spring?
Опубликовано: 2016-11-16Просто создайте один файл
Crunchify.jar
со всеми зависимостями внутри него.
На прошлой неделе я написал руководство о том, как использовать maven-resources-plugin
, maven-dependency-plugin
и maven-jar-plugin
для создания полного исполняемого проекта Jar. В результате он создает/копирует все необходимые файлы в папку /target/Crunchify
.
Before:
использование плагинов maven-resource, maven-dependency, maven-jar:
After:
Использование плагина maven-shade:
Давайте начнем с того, как добиться вышеуказанного результата:
Здесь, как вы видите, мы собрали все из Java Project в just one file
и дали имя Crunchify.jar
(со всеми файлами внутри).
Несколько дней назад я понятия не имел, как этого добиться, поскольку хотел создать runnable binary distribution of a standalone Java application
с помощью Maven. Другими словами:
- Как создать исполняемый файл jar на основе spring с помощью maven?
- Создание исполняемого двоичного дистрибутива с помощью Maven для Java + Spring + других зависимостей
- Как создавать проекты Java + Spring с помощью Maven?
Обычно в Maven мы полагаемся на управление зависимостями. Артефакт просто содержит классы/ресурсы самого себя. Maven будет нести ответственность за обнаружение всех артефактов (JAR-файлов и т. д.), от которых зависит проект, при компиляции и запуске и т. д.
С помощью maven -shade- plugin
мне удалось добиться этого . Он предоставляет возможность упаковать артефакт в uber-jar (One major file jar)
, включая его зависимости, и затенить — т. е. переименовать — пакеты некоторых зависимостей.
В моем проекте у меня так много других зависимостей, например, Spring Framework, JSON, сторонние инструменты и т. д. Ниже приведен только пример проекта, но мой производственный файл .jar получился ~5.2MB big
.
uber-jar
— это то, что берет все зависимости, извлекает содержимое зависимостей и помещает его в один JAR с классами/ресурсами самого проекта. Имея такой uber-jar, егоeasy for execution
, потому что вам понадобится только один большой JAR вместо множества маленьких JAR для запуска вашего приложения. Это также облегчает распространение в некоторых случаях.
Для этого вам необходимо обновить файл pom.xml.
Шаг 1
Взгляните на полный файл pom.xml
. В основном вас будет интересовать <build>
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi : schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion > 4.0.0 < / modelVersion > < groupId > CrunchifyMavenBuildPlugins < / groupId > < artifactId > CrunchifyMavenBuildPlugins < / artifactId > < version > 0.0.1 - SNAPSHOT < / version > < name > CrunchifyMavenBuildPlugins < / name > < properties > < project . build . sourceEncoding > UTF - 8 < / project . build . sourceEncoding > < / properties > < dependencies > < dependency > < groupId > log4j < / groupId > < artifactId > log4j < / artifactId > < version > 1.2.17 < / version > < / dependency > < dependency > < groupId > com . googlecode . json - simple < / groupId > < artifactId > json - simple < / artifactId > < version > 1.1 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > commons - beanutils < / groupId > < artifactId > commons - beanutils < / artifactId > < version > 1.8.3 < / version > < / dependency > < dependency > < groupId > commons - collections < / groupId > < artifactId > commons - collections < / artifactId > < version > 3.2.1 < / version > < / dependency > < dependency > < groupId > commons - configuration < / groupId > < artifactId > commons - configuration < / artifactId > < version > 1.10 < / version > < / dependency > < dependency > < groupId > commons - io < / groupId > < artifactId > commons - io < / artifactId > < version > 2.4 < / version > < / dependency > < dependency > < groupId > javax . mail < / groupId > < artifactId > mail < / artifactId > < version > 1.4.7 < / version > < / dependency > < dependency > < groupId > javax . servlet < / groupId > < artifactId > servlet - api < / artifactId > < version > 2.5 < / version > < / dependency > < dependency > < groupId > org . json < / groupId > < artifactId > json < / artifactId > < version > 20140107 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis - saaj < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > wsdl4j < / groupId > < artifactId > wsdl4j < / artifactId > < version > 1.6.3 < / version > < / dependency > < dependency > < groupId > com . google . zxing < / groupId > < artifactId > core < / artifactId > < version > 2.0 < / version > < / dependency > < / dependencies > < build > < pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - compiler - plugin < / artifactId > < version > 2.3.1 < / version > < configuration > < source > 1.7 < / source > < target > 1.7 < / target > < / configuration > < / plugin > < / plugins > < / pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - shade - plugin < / artifactId > < version > 1.7 < / version > < executions > < execution > < phase > package < / phase > < goals > < goal > shade < / goal > < / goals > < configuration > < ! -- Optional Start -- > < finalName > Crunchify < / finalName > < shadedArtifactAttached > true < / shadedArtifactAttached > < shadedClassifierName > jar - with - dependencies < / shadedClassifierName > < ! -- Optional End -- > < transformers > < transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" > < mainClass > com . crunchify . tutorial . CrunchifyMain < / mainClass > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . handlers < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . schemas < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . tooling < / resource > < / transformer > < / transformers > < / configuration > < / execution > < / executions > < / plugin > < / plugins > < / build > < / project > |
Как вы можете видеть здесь, я использую Resource Transformers
в файле pom.xml. Объединение classes/resources
из нескольких артефактов в один Crunchify JAR
является простым, если нет перекрытия. В противном случае требуется какая-то логика для объединения ресурсов из нескольких JAR-файлов. Вот где вступают в действие преобразователи ресурсов.

Шаг 2
Как только вы добавите maven-shade-plugin
в свой файл pom.xml
, просто используйте команду ниже для создания своего проекта.
1 |
mvn clean install |
И вы должны увидеть один Crunchify.jar
(uber-jar), созданный со all dependencies mentioned in pom.xml file
внутри.
Шаг 3
Перейдите в целевую папку вашего проекта, и вы увидите созданный файл Crunchify.jar. Просто используйте команду
$bash> java -jar Crunchify.jar
для выполнения вашего проекта.
У вас есть что добавить? Добавьте его в раздел комментариев ниже. Наслаждайтесь, удачного дня и счастливого программирования.