简介
有次想重构项目的依赖结构,将依赖的版本控制放到父工程的 pom.xml 中,公共依赖的引入放入到 common-api 模块中,各服务模块独有的依赖就放到该模块里。
没想到一路复制粘贴,搞出很多问题。如下,是某服务模块的依赖,引入了 common-api,和一个本地加载的 jar 包。
xml
<dependencies>
<dependency>
<groupId>org.apache.james</groupId>
<artifactId>apache-mime4j-core</artifactId>
<scope>system</scope>
<systemPath>../lib/本地Jar</systemPath>
</dependency>
<dependency>
<groupId>com.hezy</groupId>
<artifactId>common-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
为了显眼(实则强迫症),把 common-api 挪到了第一个,如下。
xml
<dependencies>
<dependency>
<groupId>com.hezy</groupId>
<artifactId>common-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.apache.james</groupId>
<artifactId>apache-mime4j-core</artifactId>
<scope>system</scope>
<systemPath>../lib/本地Jar</systemPath>
</dependency>
</dependencies>
结果报错了,为什么呢?
因为本地引入的这个依赖(jar 包),是基于 Maven 仓库中的公开 Jar 二次开发的,里面的包结构、类名称都和那个 Jar 高度相似,代码里优先使用了原来的那个 Jar,那个 Jar 的代码与我们业务代码不适配,所以报了编译错误。而原来那个 Jar 的依赖引入就是放到了 common-api 中,也就是说依赖在包名、类名相同的情况下,优先使用先定义的------谁在上面用谁的。
解决
解决很简单,方法一,停止手贱行为,不挪动顺序。方法二,在 common-api 中排除依赖,如下。
xml
<dependencies>
<dependency>
<groupId>com.hezy</groupId>
<artifactId>common-api</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.james</groupId>
<artifactId>apache-mime4j-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.james</groupId>
<artifactId>apache-mime4j-core</artifactId>
<scope>system</scope>
<systemPath>../lib/本地Jar</systemPath>
</dependency>
</dependencies>