来自具有相同名称的不同maven-modules的文件不能在使用maven assembly-plugin创建的jar文件中共存

lei*_*ood 6 java jar maven maven-assembly-plugin multi-module

如果有两个文件具有不同的内容但在两个不同的maven模块中具有相同的名称,那么它们都与maven assembly-plugin放在一个jar文件中,只有一个文件最终成为.jar文件的一部分.

问题:有没有办法确保在构建jar文件时将文件的内容组合到一个文件中?

我显然不想手动将信息放在一起,因为这是我试图通过在不同模块中拆分项目来避免的.

编辑:我有一个自定义的Assembly-Descriptor,我想保留,即使我开始使用另一个插件.这个描述符基本上排除了所有语言,但英语排除了资源和错误文本.

<id>jar-with-dependencies</id>
<formats>
    <format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <useProjectArtifact>true</useProjectArtifact>
        <unpack>true</unpack>
        <scope>runtime</scope>
        <unpackOptions>
            <excludes>
                <exclude>**/*Resources_*</exclude>
                <exclude>**/*ErrorsText_*</exclude>
            </excludes>
        </unpackOptions>
    </dependencySet>
</dependencySets>
Run Code Online (Sandbox Code Playgroud)

A_D*_*teo 6

根据maven-assembly-plugin文档的规定:

如果您的项目想要将工件打包在超级jar中,则程序集插件仅提供基本支持.要获得更多控制,请使用Maven Shade插件.


使用maven-shade-plugin你可以有一个胖jar(比如使用程序集插件)并解决使用Resources变换器合并文件的类似问题.在您的情况下,AppendingTransformer将合并具有相同名称但具有不同内容的文件.

某些jar包含具有相同文件名的其他资源(例如属性文件).为避免覆盖,您可以选择通过将其内容附加到一个文件来合并它们.

一个简单的配置看起来像:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>path/to/file/file-name-here</resource>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

更新
您不需要树荫插件的外部程序集描述符,您可以直接将您的要求配置为插件配置.
在您的情况下,要从已组装的jar中排除资源,您可以使用阴影过滤器.

一个简单的配置(与上面的一个合并)看起来像:

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>**/*Resources_*</exclude>
                <exclude>**/*ErrorsText_*</exclude>
            </excludes>
        </filter>
    </filters>
</configuration>
Run Code Online (Sandbox Code Playgroud)