使用 Maven 程序集插件分离罐子

Seperate the jars using maven assembly plugin

我需要将 jar 分成不同的文件夹。

在我的项目中,我有几个模块,即:module1、module2 和 assembly。

通过使用 maven 程序集插件,我想将 modules1 和 module2 生成的 jar 放入 target/modules 并将所有依赖项放入 target/dependencies。

我怎样才能达到这个要求?

谢谢

基于您的项目结构如下:

project
    |- module1
    |- module2
    |- assembly
        |- pom.xml
        |- src
            |- assembly
                |- bin.xml

assembly应该依赖于module1module2;在 assembly/pom.xml 中设置这些依赖项:

<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>module1</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>module2</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>

您还必须在 assembly/pom.xml 中添加 maven-assembly-plugin :

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <descriptors>
            <descriptor>src/assembly/bin.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

assembly:single 绑定在 package 阶段,在 运行 mvn package.

时创建程序集

最后定义assembly/src/assembly/bin.xml如下:

<assembly   xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <id>bin</id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>modules</outputDirectory>
            <includes>
                <include>${project.groupId}:*:*</include>
            </includes>
            <excludes>
                <exclude>${project.groupId}:${project.artifactId}:*</exclude>
            </excludes>
        </dependencySet>
        <dependencySet>
            <useTransitiveDependencies>true</useTransitiveDependencies>
            <outputDirectory>dependencies</outputDirectory>
            <excludes>
                <exclude>${project.groupId}:*:*</exclude>
            </excludes>
        </dependencySet>
    </dependencySets>
</assembly>
  • format 定义程序集的格式(这里是目录,但可以是 tar.gzzip、...)
  • 首先 dependencySet 定义了一个文件夹 modules/,其中将放置来自同一 groupId 的所有工件。在这里您还可以控制是否只需要某些工件(例如,如果您只需要 module1)。 assembly JAR 已从该文件夹中排除,因为该模块仅用于创建程序集
  • second dependencySet 定义了一个文件夹 dependencies/ ,所有依赖项(和传递依赖项)都将放在其中。此处的依赖性意味着 具有不同 groupId 的工件,如 excludes 子句
  • 所述

mvn package 将生成程序集(在 assembly/target/ 文件夹中),命名为 assembly-${project.version}-bin,具有您想要的结构。