文章目录
1. jar包冲突问题
在日常开发中,团队中每个程序员都需要自己去找依赖,即使是做同一个项目,每个模块也各加各的依赖,没有统一管理。但一旦依赖确定下来,把这些依赖放在父工程中做依赖管理,各个子模块各取所需,这样基本上就能很好的避免问题的扩散。
2. 解决办法
不管具体使用的是什么工具,基本思路无非是这么两步:
- 把彼此冲突的
jar
包找到 - 在冲突的
jar
包中选定一个,具体做法无非是通过exclusions
排除依赖,或是明确声明依赖。
2.1 Maven Helper插件
这个插件是 IDEA
中安装的插件,不是 Maven
插件。它能够罗列出来同一个 jar
包的不同版本,以及它们的来源,但是对不同 jar
包中同名的类没有办法。
2.1.1 安装 Maven Helper 插件
装完要重启Idea
2.1.2 pom.xml 依赖冲突分析
2.1.2.1 打开依赖分析界面
注意:这个功能需要安装了
IDEA
的Maven helper
插件才有。
2.1.2.2 查看冲突分析结果
2.2 Maven 的 enforcer 插件
使用 Maven
的 enforcer
插件既可以检测同一个 jar
包的不同版本,又可以检测不同 jar
包中同名的类。
2.2.1 引入 netty 依赖
这里引入两个对 netty
的依赖,展示不同 jar
包中有同名类的情况。
<dependencies>
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.2.10.Final</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.9.2.Final</version>
</dependency>
</dependencies>
2.2.2 配置 enforcer 插件
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-dependencies</id>
<phase>validate</phase>
<goals>
<goal>display-info</goal>
<goal>enforce</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>extra-enforcer-rules</artifactId>
<version>1.0-beta-4</version>
</dependency>
</dependencies>
<configuration>
<rules>
<banDuplicateClasses>
<findAllDuplicates>true</findAllDuplicates>
</banDuplicateClasses>
</rules>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
2.2.3 测试
执行如下 Maven
命令:mvn clean package enforcer:enforce
部分运行结果:
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (default-cli) @ pro32-duplicate-class ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicateClasses failed with message:
Duplicate classes found:
Found in:
io.netty:netty:jar:3.9.2.Final:compile
org.jboss.netty:netty:jar:3.2.10.Final:compile
Duplicate classes:
org/jboss/netty/channel/socket/ServerSocketChannelConfig.class
org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.class
org/jboss/netty/util/internal/jzlib/Deflate.class
org/jboss/netty/handler/codec/serialization/ObjectDecoder.class
org/jboss/netty/util/internal/ConcurrentHashMap$HashIterator.class
3. 引入非Maven jar包
在 Maven
工程中用到的 jar
包通常都是通过 Maven
本身的机制导入进来的,而实际开发中确实有可能用到一些 jar
包并非是用 Maven
的方式发布,那自然也没法通过 Maven
导入。
3.1 将该 jar 包安装到 Maven 仓库
使用 install
插件的 install-file
目标:
mvn install:install-file -Dfile=[体系外 jar 包路径] \
-DgroupId=[给体系外 jar 包强行设定坐标] \
-DartifactId=[给体系外 jar 包强行设定坐标] \
-Dversion=1 \
-Dpackage=jar
例如(Windows
系统下使用 ^
符号换行;Linux
系统用 \
):
mvn install:install-file -Dfile=D:\idea\maven-outer\maven-outer.jar ^
-DgroupId=com.scorpios.maven ^
-DartifactId=maven-outer ^
-Dversion=1 ^
-Dpackaging=jar
执行完上述命令后,会把非Maven
的jar
安装到本地仓库中,并会生成相应的pom
文件,这样就可以在Maven
项目中进行引入