从依赖jar中排除Java包

Pet*_*zov 15 dependencies jar maven-3 maven

我想使用来自第三方供应商的jar.但是在这个jar中我有旧版本的Java包org.osgi.framework我需要找到一些方法来从主项目中排除包.像这样的东西:

<dependency>
      <groupId>com.ibm</groupId>
          <artifactId>com.ibm.ws.admin.client</artifactId>
          <version>8.5.0</version>
          <exclusions>
             <exclusion>org.osgi.framework</exclusion>
          </exclusions>
          <type>jar</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

你能推荐一些解决方案吗?

A_D*_*teo 6

虽然更好的解决方案是用分类器重新包装依赖项(不包含不需要的包)(如本答案所述),然后将其发布到企业Maven存储库中(或将其安装到本地Maven缓存中,如果是个人的话)专案),以下是另一种解决方案,也应该适合您的需求。

您可以有一个多模块 Maven项目,只有一个具有此依赖项的模块,并且可以在其中使用Maven Shade插件及其filters属性,如官方示例中所述

根据文档,该filters元素:

要使用的存档过滤器。允许您以artifactSet使用的复合标识符的形式指定工件,并使用一组包含/排除文件模式来过滤将归档内容添加到阴影罐中

在您的情况下,以下配置应应用过滤器:

<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>
                        <filters>
                            <filter>
                                <artifact>com.ibm:com.ibm.ws.admin.client</artifact>
                                <excludes>
                                    <exclude>org/osgi/framework/**</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

从该package阶段生成的jar 不再包含该包。作为Maven输出的一部分,您应该看到:

[INFO] --- maven-shade-plugin:2.4.3:shade(默认)@ test-checksum ---
[INFO]包括com.ibm:com.ibm.ws.admin.client:jar:8.5.0在有阴影的罐子里。
[INFO]用阴影伪像替换原始伪像。

您可以验证生成的jar的内容,过滤后的程序包不应该存在。

然后,此模块的输出将包含您要查找的“新” /过滤后的jar。然后,使用者模块将只需要对此模块具有依赖性,并因此应用了过滤器。
这样的多模块项目的示例为:

+ aggregator/parent project
    - filtered-dependency-module (applying the shade filter)
    - consumer-module (having dependency on the filtered module)
Run Code Online (Sandbox Code Playgroud)

更新
进一步说明:在应用过滤器的模块中,应将依赖项声明为可选,以便使用者模块不会再次将其引入。

<dependencies>
    <dependency>
        <groupId>com.ibm</groupId>
        <artifactId>com.ibm.ws.admin.client</artifactId>
        <version>8.5.0</version>
        <optional>true</optional>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

可选不会影响模块本身,只会影响使用方。并且Shade插件将继续工作(以防万一,我重新测试了它)。