当前位置: 首页 > 知识库问答 >
问题:

从依赖项jar中排除Java包

万俟飞语
2023-03-14

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

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

共有1个答案

厉令
2023-03-14

虽然更好的解决方案是使用分类器(如本答案所述)重新打包依赖项(没有不需要的包),并将其发布在您的企业Maven存储库中(如果是个人项目,则将其安装到本地Maven缓存中),但下面是一个不同的解决方案,也应该适合您的需求。

你可以有一个多模块的Maven项目,有一个只有这个依赖项的模块,在其中你可以使用Maven Shade插件和它的过滤器属性,如官方示例所述。

根据文档,过滤器元素

要使用的存档过滤器。允许您以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>

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

[INFO]——maven shade插件:2.4.3:shade(默认)@测试校验和--
[INFO]包括com。ibm:com。国际商用机器公司ws。管理客户端:jar:8.5.0,位于阴影jar中
[INFO]将原始工件替换为着色工件。

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

然后,这个模块的输出将有您正在寻找的“新”/过滤罐。然后消费者模块只需要依赖于这个模块,并因此应用过滤器。
这样的多模块项目的一个例子是:

+ aggregator/parent project
    - filtered-dependency-module (applying the shade filter)
    - consumer-module (having dependency on the filtered module)

Update
进一步注意:在应用过滤器的模块中,您应该声明依赖项为可选的,这样消费者模块就不会再次传递它。

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

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

 类似资料:
  • 问题内容: 我有一个项目,该项目依赖于由供应商控制的工件。该工件包含一些我依赖的类,其中一些类较旧并且会引起问题。有没有办法让Maven自动扩展jar,删除类并将它们重新打包为依赖项?我会举一个例子。 所以- 我需要使用在项目网站,但我需要使用从神器。我无法修改Supplier:artifact或us:dependency。 有任何想法吗?! 问题答案: 从版本2.0.9开始,maven保留了类路

  • 是否有一种方法可以使用Gradle从一组中排除特定的jar?我尝试了下面的代码,但这删除了该组的所有jar

  • 问题内容: 我遇到一个问题,其中同一类的多个版本显示在我的类路径中。有问题的班级是。我要使用的版本由引入。但是,我们还使用了Jira rest客户端库,该库依赖于较旧版本的jersey(),该版本包含捆绑在jar中的java.ws软件包。 这是构建文件中的示例片段: 我无法删除它,因为它使用了与新版本不同的软件包名称,并且会导致在Jira客户端中找不到类def的异常。 据我所知,目前我的选择是:

  • 我想使用nd4j-cuda-10.2中的项目。它有两个操作系统(Linux和Windows)的jar文件。在使用windows系统时,如何将jar从Linux中排除,反之亦然?。 [Maven Repository][1][1]:https://repo1.maven.org/maven2/org/nd4j/nd4j-cuda-10.2/1.0.0-beta7/ 由于jar文件的重量。我想排除对每

  • 我在Jetty上使用Spring Boot,似乎我不能在Gradle构建文件中排除所有的Tomcat依赖项。 build.gradle的相关部分: 然而,当我运行时,Tomcat的一部分仍然存在,并导致WebSocket出现问题: 为什么< code > spring-boot-starter-Tomcat 没有被排除在< code > spring-boot-starter-web 之外?