有两个类com.package.a
,一个来自
<dependency>
<groupId>com.package</groupId>
<artifactId>art1</artifactId>
</dependency>
一个来自
<dependency>
<groupId>com.package</groupId>
<artifactId>art2</artifactId>
</dependency>
注意工件ID是不同的。
对于不同的Maven概要文件,我希望排除一个版本,只保留另一个版本。我正在使用Shade插件。
使用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插件的
配置中,可以使用
。
这是一个完整的操作配置:
<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包的旧版本我需要找到一些方法将包从主项目中排除。像这样的东西: 你能推荐一些解决方案吗?