我是否可以将Maven配置为选择冲突的“最新”依赖,而不是“最近”?
“最新”是Ivy和其他合理的依赖管理者的默认设置,请参阅http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html
我发现“最近”的策略很少是我想要的。
我正在使用Maven 3.3.3,但如果需要,我可以切换版本。
我知道如何覆盖Maven对个别冲突的选择,但我更愿意更改默认值,以便我不必一次检测并修复每个冲突。
(参见the Maven docs关于“依赖调解”)
答案 0 :(得分:7)
我可以将Maven配置为在解决版本冲突时自动使用“最新”版本的依赖项而不是“最近”版本吗?
否 ,您无法将Maven的依赖关系中介策略配置为最近的其他内容。
添加configurable dependency mediation strategies has been proposed before,但最终被放弃了,因为该提案涉及更改POM XSD,这在多年内没有发生过。
为什么Maven会使用最近的策略作为默认策略?
Maven青睐最近的策略有两个原因:
但我真的想要一个不同的依赖中介策略。我该怎么办?
这些是您最好的选择:
NearestVersionSelector
in MavenRepositorySystemUtils
指定使用“最近”策略。您可以create your own Maven extension定义自己的VersionSelector
,然后在您的扩展程序的afterSessionStart
方法中,将会话的DependencyGraphTransformer
替换为使用您的会话的VersionSelector
自定义import javax.json.*;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonWriter;
class JsonTest {
public static void main(String[] args){
JsonObject obj = Json.createObjectBuilder()
.add("name", "foo")
.add("num", new Integer(100))
.add("balance", new Double(1000.21))
.add("is_vip", new Boolean(true)).build();
System.out.print(obj);
}
}
。答案 1 :(得分:2)
您还可以将"requireUpperBoundDeps"规则用于Maven“enforcer”插件,该插件不会直接实施“最新胜利”冲突解决策略,但会强制最终结果相同。您需要手动向POM添加传递依赖<exclusions>
或<dependencyManagement>
规则,以便在每次冲突中选择最新的依赖关系,但至少您会相信最终结果是“最新的胜利”。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<requireUpperBoundDeps />
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
</plugin>