- 1. jar包冲突问题
- 2. 解决办法
- 2.1 Maven Helper插件
- 2.1.1 安装 Maven Helper 插件
- 2.1.2 pom.xml 依赖冲突分析
- 2.1.2.1 打开依赖分析界面
- 2.1.2.2 查看冲突分析结果
- 2.2 Maven 的 enforcer 插件
- 2.2.1 引入 netty 依赖
- 2.2.2 配置 enforcer 插件
- 2.2.3 测试
- 3. 引入非Maven jar包
- 3.1 将该 jar 包安装到 Maven 仓库
在日常开发中,团队中每个程序员都需要自己去找依赖,即使是做同一个项目,每个模块也各加各的依赖,没有统一管理。但一旦依赖确定下来,把这些依赖放在父工程中做依赖管理,各个子模块各取所需,这样基本上就能很好的避免问题的扩散。
2. 解决办法不管具体使用的是什么工具,基本思路无非是这么两步:
- 把彼此冲突的
jar
包找到 - 在冲突的
jar
包中选定一个,具体做法无非是通过exclusions
排除依赖,或是明确声明依赖。
这个插件是 IDEA
中安装的插件,不是 Maven
插件。它能够罗列出来同一个 jar
包的不同版本,以及它们的来源,但是对不同 jar
包中同名的类没有办法。
装完要重启Idea
2.1.2 pom.xml 依赖冲突分析 2.1.2.1 打开依赖分析界面注意:这个功能需要安装了 IDEA
的 Maven helper
插件才有。
使用 Maven
的 enforcer
插件既可以检测同一个 jar
包的不同版本,又可以检测不同 jar
包中同名的类。
这里引入两个对 netty
的依赖,展示不同 jar
包中有同名类的情况。
org.jboss.netty
netty
3.2.10.Final
io.netty
netty
3.9.2.Final
2.2.2 配置 enforcer 插件
org.apache.maven.plugins
maven-enforcer-plugin
1.4.1
enforce-dependencies
validate
display-info
enforce
org.codehaus.mojo
extra-enforcer-rules
1.0-beta-4
true
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
导入。
使用 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
项目中进行引入