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

Maven动态地从不同依赖项中排除同名类

能翔宇
2023-03-14

有两个类com.package.a,一个来自

<dependency>
    <groupId>com.package</groupId>
    <artifactId>art1</artifactId>
</dependency>

一个来自

<dependency>
    <groupId>com.package</groupId>
    <artifactId>art2</artifactId>
</dependency>

注意工件ID是不同的。

对于不同的Maven概要文件,我希望排除一个版本,只保留另一个版本。我正在使用Shade插件。

共有1个答案

危钱明
2023-03-14

使用maven-shade-plugin,可以排除特定依赖项的某些类。这是在筛选器属性的帮助下配置的:

要使用的存档筛选器。允许您以artifactset使用的复合标识符和一组include/exclude文件模式的形式指定一个工件,用于筛选哪些归档内容被添加到带阴影的JAR中。

在您的情况下,要将类com.package.a从依赖项art2中排除,可以使用:

<filters>
  <filter>
    <artifact>com.package:art2</artifact>
    <excludes>
      <exclude>com/package/A.class</exclude>
    </excludes>
  </filter>
</filters>

为了使其动态化,即在构建时选择要保留的com.package.a类,您不需要使用配置文件。您可以使用一个Maven属性,该属性将保存要过滤的依赖项的工件id。在属性中,添加

<properties>
  <shade.exclude.artifactId>art2</shade.exclude.artifactId>
</properties>

shade.exclude.artifactid属性将保存要筛选的依赖项的项目id。默认情况下,此配置将选择art2。然后,在Shade插件的 配置中,可以使用 com.package:${Shade.exclude.artifactID}

这是一个完整的操作配置:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.4.3</version>
      <executions>
        <execution>
          <id>shade</id>
          <goals>
            <goal>shade</goal>
          </goals>
          <phase>package</phase>
          <configuration>
            <filters>
              <filter>
                <artifact>com.package:${shade.exclude.artifactId}</artifact>
                <excludes>
                  <exclude>com/package/A.class</exclude>
                </excludes>
              </filter>
            </filters>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
<properties>
  <shade.exclude.artifactId>art2</shade.exclude.artifactId>
</properties>

运行MVN clean Package将创建一个来自art1的带有a.class的uber jar,因为来自art2的jar被排除在外。然后,运行MVN clean package-dshade.exclude.artifactid=art1将使a.class与相依项art2保持距离,因为art1中的相依项已被排除。

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

  • 例如,我有依赖性:

  • 我有一个编译和运行时所需的依赖项,但我想在运行测试时将其排除。这可能吗?也许,通过设置个人资料?但是,如何仅在生命周期阶段停用它?

  • 我创建了一个基于Maven的spring引导项目来探索如何使其在Websphere Application Server上运行。这是我需要排除spring-boot-starter-web的嵌入式Tomcat的方法。 我试过以下几件事: 为spring-boot-starter-tomcat添加了一个新的依赖项,其作用域为:provided(请参见在部署到JBOSS[spring-boot])时从

  • 我在我的项目中遇到了依赖关系冲突的问题。特别是,slf4j日志记录有两种实现:slf4j-简单和logback-经典,我得到了 在运行时。 logback-classic对我来说是必备的依赖项(因为dropwizard),但slf4j-simple不是真的,我想把它从我的uber项目中去掉。只是没那么容易。 我的“uber jar”依赖于“small jar”,而“small-jar”又依赖于“s

  • 我想使用第三方供应商的jar。但是在这个jar中,我有Java包的旧版本我需要找到一些方法将包从主项目中排除。像这样的东西: 你能推荐一些解决方案吗?