Я не понимаю, как добавить часть зависимостей в <dependencySet>
в сборке
например, я имею зависимость от группы: artifact1 и group: artifact2, которые зависят от группы: artifact0.
Я создаю дескриптор сборки, который должен скопировать группу: artifact2 со всеми зависимостями.
Если зависимость от группы: artifact1 в pom.xml появляется перед зависимостью от группы: artifact2, у меня есть только group: artifact2 в целевом каталоге, но если я изменяю порядок зависимостей, то у меня есть оба артефакта в целевом каталоге.
В результате я хочу иметь две директории с разными наборами библиотек.
Простой пример здесь
pom.xml
<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>com.kudrevatykh.stackoverflow</groupId>
<artifactId>assembly-question</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring.version>3.2.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>install</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptor>install.xml</descriptor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
install.xml
<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>install</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>dir</format>
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<includes>
<include>org.springframework:spring-jdbc:jar</include>
</includes>
<useTransitiveFiltering>true</useTransitiveFiltering>
<outputDirectory>/</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 12:44:56+0400)
Maven home: C:\Users\akudrevatykh\bin\apache-maven-3.0.4
Java version: 1.7.0_11, vendor: Oracle Corporation
Java home: C:\Users\akudrevatykh\bin\jdk1.7.0_11\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"
Существует старая ошибка, открытая для плагина maven-assembly http://jira.codehaus.org/browse/MASSEMBLY-357 с аналогичными примерами.
Вам нужно создать несколько dependencySet
s, по одному для каждого каталога, который вы хотите создать, а затем использовать includes
или excludes
чтобы контролировать, какие зависимости идут в какой каталог.
Например, если вы хотите, чтобы spring-aop
закончил в каталоге aop
и spring-jdbc
чтобы попасть в каталог jdbc
, вы должны использовать следующие параметры dependencySet
:
<dependencySets>
<dependencySet>
<outputDirectory>aop</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<includes>
<include>org.springframework:spring-aop:jar</include>
</includes>
</dependencySet>
<dependencySet>
<outputDirectory>jdbc</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<includes>
<include>org.springframework:spring-jdbc:jar</include>
</includes>
</dependencySet>
</dependencySets>
Вам нужно будет поиграть, чтобы обеспечить правильные транзитивные зависимости, возможно, добавив дополнительные include
s, но вы получите суть.
Вы должны определить зависимости, которые вы хотели бы иметь в своей сборке в файле pom в качестве зависимостей. Это гарантирует, что порядок построения автоматически определяется Maven и будет одинаковым все время. Кроме того, вам просто нужно указать следующий дескриптор, который будет упаковывать все зависимости в zip файл:
<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>dist-assembly</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
Пусть транзитивные зависимости переходят в другое место:
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>true</useTransitiveDependencies>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
<excludes>
<exclude>${project.groupId}:*</exclude>
</excludes>
</dependencySet>
</dependencySets>
${project.groupId}
исключает артефакты проекта. Вы можете повторить эту часть так часто, как вам нужно, чтобы ее копировали.
<include>org.springframework:spring-jdbc:jar</include>
на <exclude>org.springframework:spring-aop:jar</exclude>
в исходном сообщении, у меня будет точно такой же результат - некоторые транзитивные зависимости отсутствуют.
dependencySets
, я должен описать все переходные зависимости вручную. Я хочу избегать перечисления всех переходных зависимостей каждый раз.