如何使用maven程序集插件从依赖jar中排除一个包?

时间:2016-02-06 22:31:47

标签: java maven jar packaging maven-assembly-plugin

我正在使用maven程序集插件来打包我的项目的发行版,其中包含一个带有依赖项jars的lib文件夹,一个包含资源的配置文件夹和包含项目类文件的jar文件。我需要从lib文件夹中的一个依赖项jar中排除一个包。

程序集插件有一个解压缩依赖项jar的选项,如果使用了这个,那么你可以用assembly.xml排除一个包,如下所示:

<assembly>
    <formats>
        <format>tar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>true</unpack>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>./${project.build.finalName}/lib</outputDirectory>
            <scope>runtime</scope>
            <unpackOptions>
                <excludes>
                    <exclude>**/excludedpackage/**<exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
    </dependencySets>
</assembly>

我的问题是,如何在不使用unpack的情况下从依赖jar中排除一个包(即将所有依赖项打包为jar)?理想情况下,我想要一个可以使用程序集插件完成的解决方案 - 如果不可能,那么实现我想要做的最简单的方法是什么?

1 个答案:

答案 0 :(得分:1)

我不认为你可以在解压缩和过滤后重新包装JAR。您可以在Maven Assembly Plugin JIRA提交增强请求。

一个(复杂的)解决方法是使用maven-dependency-pluginunpack项目的依赖关系来排除某些内容,然后使用maven-jar-pluginjar类再次排除新JAR中的包,最后为该特定依赖项的<files>声明maven-assembly-plugin元素。

示例配置

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>unpack</id>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <phase>prepare-package</phase>
            <configuration>
                <includeArtifactIds><!-- include here the dependency you want to exclude something from --></includeArtifactIds>
                <outputDirectory>${project.build.directory}/unpack/temp</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>repack</id>
            <goals>
                <goal>jar</goal>
            </goals>
            <phase>prepare-package</phase>
            <configuration>
                <classesDirectory>${project.build.directory}/unpack/temp</classesDirectory>
                <excludes>
                    <exclude>**/excludedpackage/**</exclude>
                </excludes>
                <outputDirectory>${project.build.directory}/unpack</outputDirectory>
                <finalName>wonderful-library-repackaged</finalName> <!-- give a proper name here -->
            </configuration>
        </execution>
    </executions>
</plugin>

然后在您的装配配置中,您将拥有:

<files>
    <file>
        <source>${project.build.directory}/unpack/wonderful-library-repackaged.jar</source>
        <outputDirectory>/${project.build.finalName}/lib</outputDirectory>
    </file>
</files>