Я бы хотел, чтобы Maven упаковал проект вместе с его зависимостями времени выполнения. Я ожидаю, что он создаст файл JAR со следующим манифестом:
.....
Main-Class : com.acme.MainClass
Class-Path : lib/dependency1.jar lib/dependency2.jar
.....
и создаст следующую структуру каталогов:
target
|-- ....
|-- my-project.jar
|-- lib
|-- dependency1.jar
|-- dependency2.jar
То есть, я хочу, чтобы основной JAR исключал любые зависимости, и я хочу, чтобы все транзитивные зависимости были скопированы в "lib". "подкаталог. Любые идеи?
Мне нравится, когда Maven упаковывает проект с зависимостями времени выполнения.
Эта часть неясна (это не совсем то, что вы описываете сразу после). Мой ответ касается того, что вы описали.
Я ожидаю, что он создаст JAR-файл со следующим манифестом (...)
Настройте Maven Jar Plugin для этого (или, точнее, Maven Archiver ]):
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.acme.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
...
<dependencies>
<dependency>
<groupId>dependency1</groupId>
<artifactId>dependency1</artifactId>
<version>X.Y</version>
</dependency>
<dependency>
<groupId>dependency2</groupId>
<artifactId>dependency2</artifactId>
<version>W.Z</version>
</dependency>
</dependencies>
...
</project>
В результате будет создан файл MANIFEST.MF со следующими записями:
...
Main-Class: fully.qualified.MainClass
Class-Path: lib/dependency1-X.Y.jar lib/dependency2-W.Z.jar
...
и будет создана следующая структура каталогов (...)
Это можно сделать с помощью подключаемого модуля зависимостей Maven и цель dependency: copy-dependencies
. Из документации:
dependency: copy-dependencies
берет список прямых зависимостей проекта и, возможно, транзитивных зависимостей и копирует их в указанное место, удаляя версию при желании. Эту цель также можно запустить из командной строки.
Вы можете привязать его к фазе пакета
:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
Вы можете использовать плагин maven jar, взгляните на эту страницу: http://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html