maven自己的仲裁机制

maven现在被广泛用来做项目管理的工具,我们经常在maven的pom文件中指定我们项目依赖的二方库,我们也会经常遇到jar包冲突,类冲突的问题。关于类冲突就是由于maven自己的仲裁机制,把应该引入的jar包给仲裁了,那么maven自己到底是如何仲裁jar包的呢?

假设我们在自己的pom.xml中引入下面的jar包

1
2
3
4
5
6
7
8
9
10
11
12
    ...
    <dependency>
        <groupId>com.xx.yy</groupId>
        <artifactId>AA</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.xx.yy</groupId>
        <artifactId>BB</artifactId>
        <version>1.0.0</version>
    </dependency>
    ....

AA间接依赖CC对应maven坐标如下

1
2
3
4
5
    <dependency>
        <groupId>com.xx.yy</groupId>
        <artifactId>CC</artifactId>
        <version>1.0.0</version>
    </dependency>

BB间接依赖CC对应maven坐标如下

1
2
3
4
5
    <dependency>
        <groupId>com.xx.yy</groupId>
        <artifactId>CC</artifactId>
        <version>1.0.1</version>
    </dependency>

此时maven编译的时候会进行仲裁,首先看依赖的路径,假设当前项目是X,对于CC有两条依赖路径,只是version不同,其他都一样。
1.X->AA->CC 1.0.0
2.X->BB->CC 1.0.1
发现两条路径的长度一样。接下来观察AA和BB在pom中声明的顺序,发现AA在BB的前面,此时CC使用1.0.0的版本。

因此maven自己的仲裁机制是先看路径长度,路径长度一样再看声明顺序。

如果我们书写下面的pom文件

1
2
3
4
5
6
7
8
9
10
11
12
...
    <dependency>
        <groupId>com.xx.yy</groupId>
        <artifactId>AA</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.xx.yy</groupId>
        <artifactId>AA</artifactId>
        <version>1.0.1</version>
    </dependency>
...

按照上面的规则,路径相同,看声明顺序,因此1.0.0的版本被使用。

注意:
maven仲裁的前置条件是artifactId和groupId一样。