【问题标题】:Exclude Java package from dependency jar从依赖项 jar 中排除 Java 包
【发布时间】:2016-04-29 14:11:30
【问题描述】:

我想使用第三方供应商的 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>

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

【问题讨论】:

    标签: maven jar dependencies maven-3


    【解决方案1】:

    虽然更好的解决方案是使用分类器(如 this answer 中所述)重新打包依赖项(不包含不需要的包)并将其发布到您的企业 Maven 存储库(或 install it 到本地 Maven 缓存中,如果是个人项目),下面是一个不同的解决方案,它也应该满足您的需求。

    您可以拥有一个 multi-module Maven 项目,其中包含一个仅具有此依赖项的模块,并且您可以在其中使用 Maven Shade Plugin 及其 filters 属性,如其 official example 中所述。

    根据documentationfilters 元素:

    要使用的存档过滤器。允许您以 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] 在阴影 jar 中包含 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)
    

    更新
    进一步注意:在应用过滤器的模块中,您应该将依赖项声明为optional,以便消费者模块不会再次将其引入。

    <dependencies>
        <dependency>
            <groupId>com.ibm</groupId>
            <artifactId>com.ibm.ws.admin.client</artifactId>
            <version>8.5.0</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
    

    Optional 不会影响模块本身,只会影响消费者。并且 Shade 插件将继续工作(我重新测试了它,以防万一)。

    【讨论】:

    • @PeterPenzov 您是否尝试过上述方法?成功了吗?
    • 不,即使使用建议的解决方案,我仍然遇到同样的问题。
    • 因此,您配置了一个多模块 maven 项目,其中包含一个仅用于创建过滤 ibm 库的依赖项的模块,然后您的模块依赖于这个(因此不再依赖 ibm)并且您仍然得到包裹?
    • 不,这次我收到编译警告。看起来必须将 Netbeans 配置为不将包使用到 JVM 类路径中
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多