Как создать исполняемый банку без зависимостей с помощью Maven?
Я хочу упаковать его не в одном исполняемом банке для распространения. Мне нужен исполняемый файл, чтобы быть чем-то вроде main.jar и всех зависимостей в libs/*. Jar
Как я могу сделать исполняемый банку maven без предварительного включения в него библиотек зависимостей?
В Как создать исполняемый JAR с зависимостями с помощью Maven? есть примечание, ответившее Dec 1 '10 в 10:46
André Aronsen, но это просто не работает (не удалось установить s.a.descriptorRef).
Ответы
Ответ 1
Вы можете достичь этого в определенной степени.
Во-первых, вы создадите исполняемый jar, настроив maven jar plugin.
Затем вы должны использовать плагин сборки maven для создания jar-с-зависимостями, исключая вашу банку проекта. Для этого вы создадите файл дескриптора, скажем src/main/assembly/descriptor.xml
, как это.
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
Используйте его в своем проекте следующим образом.
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
</configuration>
[...]
</plugin>
</plugins>
</build>
</project>
В итоге вы получите две банки - одну исполняемую банку, созданную вашим проектом, а другую - jar-with-dependencies, созданные плагином сборки.
Ответ 2
Я предпочитаю это немного измененное решение. Создайте свой исполняемый файл jar с установленным classpath и скопируйте все зависимости в данный каталог.
Вам не нужны никакие дополнительные файлы.
Зависимости копируются на этапе установки.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- optional -->
<!-- exclude copying test and provided dependencies -->
<includeScope>runtime</includeScope>
<excludeScope>provided</excludeScope>
<!-- optional -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Я обновил ответ, чтобы скопировать только зависимости во время выполнения, как описано здесь - копирование правильных зависимостей. Тест и предоставленные зависимости исключены.
Оказывается, что если вы хотите исключить зависимости как из тестовой, так и из предоставленных областей, вам необходимо исключить предоставленную область и включить область выполнения.