我有一个maven模块,它有一些依赖项。在某个配置文件中,我想要排除其中一些依赖项(确切地说,所有依赖项都具有某个组ID)。但是,它们必须存在于所有其他配置文件中。有没有办法从配置文件的依赖项中指定排除项?
答案 0 :(得分:13)
据我所知,没有,你无法停用依赖关系(你可以排除传递依赖,但这不是你要求的)和是,你是什么目前正在使用POM(手动编辑它)是错误的。
因此,您应该将它们放在配置文件中,而不是删除依赖项:
第三种选择是(不是基于档案的):
答案 1 :(得分:5)
我遇到的一种方法是将依赖项放在一个单独的pom中。然后,您可以通过个人资料添加<exclusions>
部分。
<dependencies>
<dependency>
<groupId>my.company.dependencies</groupId>
<artifactId>my-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
</dependency>
</dependencies>
<profile>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>exclude-deps</name>
</property>
</activation>
<dependencies>
<dependency>
<groupId>my.company.dependencies</groupId>
<artifactId>my-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>my.company</groupId>
<artifactId>bad-dep-1</artifactId>
</exclusion>
<exclusion>
<groupId>my.company</groupId>
<artifactId>bad-dep-2</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</profile>
答案 2 :(得分:4)
我认为不可能排除直接依赖关系(至少没有提到here)。
您可以做的最好的事情是将每个案例的所需依赖项包含在不同的配置文件中(如已建议的那样),但是,您需要创建两个“互斥”配置文件,其中一个配置文件“默认处于活动状态” ”。实现这一目标的最可靠方法是使用参数进行配置文件激活,例如
<profiles>
<profile>
<id>default-profile</id>
<activation>
<property><name>!exclude</name></property>
</activation>
<dependencies>
dependency-A
dependency-B
...
</dependencies>
</profile>
<profile>
<id>exclude-profile</id>
<activation>
<property><name>exclude</name></property>
</activation>
<!-- exclude/replace dependencies here -->
</profile>
</profiles>
然后使用“mvn [goal]”将使用配置文件“default-profile”,但“mvn [goal] -Dexclude”将使用配置文件“exclude-profile”。
请注意,在某些情况下使用“activeByDefault”而不是“默认”配置文件的参数可能会有效,但也可能会导致意外行为。问题是只要在多模块构建的任何其他模块中没有其他活动配置文件,'activeByDefault'就会使配置文件处于活动状态。
答案 3 :(得分:4)
您可以将其设置为provided
,而不是排除配置文件中的依赖项。这不需要任何过于复杂的配置,并且会排除最终构建中不需要的依赖项。
在所需的个人资料中,添加dependencies
部分,复制要排除的部分的声明,并将其作为provided
范围。
例如,假设您要排除slf4j-log4j12
:
<profiles>
<!-- Other profiles -->
<profile>
<id>no-slf4j-log4j12</id>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<!-- Other profiles -->
</profiles>
答案 4 :(得分:1)
maven是一个工具,我们可以对其进行破解。
例如,在pom.xml中:
... other pom stuff ...
<properties>
<artifact1>artifact1</artifact1>
<artifact2>artifact2</artifact2>
<artifact1.version>0.4</artifact1.version>
<artifact2.version>0.5</artifact2.version>
</properties>
<profile>
<id>remove-artifact2</id>
<properties>
<artifact1>artifact1</artifact1>
<artifact2>artifact1</artifact2>
<artifact1.version>0.4</artifact1.version>
<artifact2.version>0.4</artifact2.version>
</properties>
</profile>
artifact1:0.4
和artifact2:0.5
将成为依赖项。 mvn -P remove-artifact2
安装此pom.xml
结果pom.xml仅包含artifact1:0.4
这在api迁移期间非常方便,在api迁移中,工件被重命名并且版本不兼容。
答案 5 :(得分:0)
有点脏,但轻量级的解决方案是使用provided
。
与其他范围不同,您可以使用此功能:
runtime
或test
不同,后者一次只禁用一个system
范围dependencyManagement
范围要求那样指定某个虚拟jar的路径只要您在float
之外使用此黑客,就不会导入任何内容。