记录一次pom.xml依赖顺序产生的错误

简介

有次想重构项目的依赖结构,将依赖的版本控制放到父工程的 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>
相关推荐
zyplayer-doc7 小时前
VuePress类静态文档站和动态知识库怎么选:两种技术路线的适用场景
javascript·人工智能·后端·安全·智能手机
用户938515635078 小时前
从前后端分离到前端接口工程:React + MockJS + Vite 解析
前端·后端·全栈
码事漫谈9 小时前
世界由什么构成——这个问题比你想的更缠人
后端
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 2 章 IOC 思想与实现 阅读笔记 1
spring boot·笔记·后端
山荷枝10 小时前
03-框架--Spring
java·后端·spring
ChaHae-In10 小时前
SpringBoot统一功能处理
java·spring boot·后端
65岁退休Coder12 小时前
LangChain v1.3.4 笔记 - 07 补充:链式调用 LCEL
后端·python·langchain
卷无止境12 小时前
FastAPI 部署在 Nginx 后面到底该怎么配
后端·python