Что вы действительно хотите сделать здесь, это создать собственный архив для вашего проекта. Для этого вы хотите использовать maven-assembly-plugin
.
Есть несколько аспектов, чтобы рассмотреть следующие вопросы:
- Вы хотите базовый каталог
build
. Это задается параметром <baseDirectory>
.
- Вы хотите иметь все зависимости проекта в репозитории, подобной каталогу. Для этого вы можете использовать таможню
outputFileNameMapping
для dependencySet
. Это позволяет использовать a set of properties; в этом случае нас интересует идентификатор группы, идентификатор артефакта и версия. Нам нужно отключить <useProjectArtifact>
, иначе он также включит главный артефакт проекта.
- Для основного артефакта мы просто используем элемент
<file>
, указывая на главный артефакт проекта.
Дескриптор сборки будет выглядеть следующим образом:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
<format>dir</format> <!-- to turn into final archive type -->
</formats>
<baseDirectory>build</baseDirectory>
<files>
<file>
<source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>libs</outputDirectory>
<outputFileNameMapping>${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
</assembly>
Обратите внимание, что она использует <format>
из dir
, что означает, что он не «пакет» выходной структуры внутри архива, но оставляет ее структуру каталогов , В будущем вы сможете настроить этот дескриптор сборки с помощью сценариев запуска и сделать окончательный архив, изменив этот формат на тот, который вам нужен.
Наконец, конфигурация плагина сам будет
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor> <!-- path to the above assembly descriptor -->
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
При такой конфигурации, запуске mvn clean install
выхода будут разыскиваемой структура каталогов внутри target/${finalName}
.
'my.jar' не будет исполняемым JAR, так как он не будет содержать классы зависимостей. Похоже, вы хотите создать сборку, как пользовательский ZIP? – Tunaki
@Tunaki ему не нужно содержать классы зависимостей, в реальном проекте тоже будет запускаться, что получит все библиотеки и запустит этот .jar с допустимым пулом классов. Я отредактирую название. – GotoFinal
Хорошо, но я думаю, вам нужно упаковать те, которые находятся в конечном контейнере, например, ZIP или TAR? – Tunaki