Создание жирной банки с помощью maven
У меня есть кодовая база, которую я хочу распространять как jar. Он также имеет зависимость от внешних банок, которые я хочу связать в окончательной банке.
Я слышал, что это можно сделать с помощью maven-assembly-plug-in
, но я не понимаю как. Может кто-нибудь указать мне на некоторые примеры.
прямо сейчас, я использую жирную банку, чтобы связать последнюю банку. Я хочу добиться того же с помощью maven.
6 ответов:
добавить следующий плагин для
pom.xml
Последнюю версию можно найти по адресу https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>CHOOSE LATEST VERSION HERE</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>assemble-all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
после настройки этого плагина, под управлением
mvn package
произведет две банки: одну, содержащую только классы проекта, и вторую жирную банку со всеми зависимостями с суффиксом "-jar-with-dependencies".если вы хотите правильно
classpath
настройки во время выполнения, а затем также добавить следующие плагин<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> </plugin>
можно использовать Maven-shade-plugin.
после настройки плагина shade в вашей сборке команда
mvn package
создаст одну единственную банку со всеми зависимостями, объединенными в нее.
может быть, вы хотите
maven-shade-plugin
, связывать зависимости, минимизировать неиспользуемый код и скрывать внешние зависимости, чтобы избежать конфликтов.<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <minimizeJar>true</minimizeJar> <createDependencyReducedPom>true</createDependencyReducedPom> <dependencyReducedPomLocation> ${java.io.tmpdir}/dependency-reduced-pom.xml </dependencyReducedPomLocation> <relocations> <relocation> <pattern>com.acme.coyote</pattern> <shadedPattern>hidden.coyote</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>
ссылки:
на самом деле, добавив элемент
<archive> <manifest> <addClasspath>true</addClasspath> <packageName>com.some.pkg</packageName> <mainClass>com.MainClass</mainClass> </manifest> </archive>
объявление в Maven-jar-plugin не добавляет основную запись класса в файл манифеста для меня. Мне пришлось добавить его в плагин Maven-assembly, чтобы получить это в манифесте
можно использовать onejar-maven-plugin для упаковки. В принципе, он собирает ваш проект и его зависимости в виде одной банки, включая не только ваш файл jar проекта, но и все внешние зависимости в виде "банки банок", например
<build> <plugins> <plugin> <groupId>com.jolira</groupId> <artifactId>onejar-maven-plugin</artifactId> <version>1.4.4</version> <executions> <execution> <goals> <goal>one-jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Примечание 1: параметры конфигурации доступны в проекте Домашняя страница.
примечание 2: по той или иной причине проект onejar-maven-plugin не публикуется в Maven Central. Однако jolira.com отслеживает исходный проект и публикует его с помощью groupId
com.jolira
.
в качестве альтернативы можно использовать команду Maven тени плагин для создания
uber-jar
.<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version> Your Version Here </version> <configuration> <!-- put your configurations here --> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>