我想使用来自第三方供应商的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>
你能推荐一些解决方案吗?
答案 0 :(得分:5)
虽然更好的解决方案是使用分类器(如this answer中所述)重新打包依赖关系(没有不需要的包),然后将其发布到企业Maven存储库(或install it上)您的本地Maven缓存,如果它是个人项目),下面是一个不同的解决方案,也应该适合您的需求。
你可以有一个multi-module Maven项目,拥有一个只有这种依赖关系的模块,你可以使用Maven Shade Plugin及其filters
属性,如{{3}中所述}。
根据official example,filters
元素:
存档要使用的过滤器。允许您以artifactSet使用的复合标识符的形式指定工件,并使用一组包含/排除文件模式来过滤存档的哪些内容添加到阴影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>
<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>
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)
<强>更新强>
进一步说明:在应用过滤器的模块中,您应该将依赖关系声明为documentation,以便使用者模块不会再次传递它。
<dependencies>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>com.ibm.ws.admin.client</artifactId>
<version>8.5.0</version>
<optional>true</optional>
</dependency>
</dependencies>
可选不会影响模块本身,只影响消费者一个。 Shade插件将继续工作(我重新测试它,以防万一)。