记录一次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>
相关推荐
脚本自动化开发6 小时前
玩影之刃零,两张四千元级显卡怎么挑
后端
用户479492835691510 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
努力的小雨11 小时前
别再复制日志给AI了!我让Codex自己去观测云查报错
后端
afumu13 小时前
Go 写一个只监听 127.0.0.1 的控制服务:鉴权、白名单、危险命令拦截
后端·安全·go
johnjincaaaa14 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
用户47027840040514 小时前
C语言编译与链接
后端·开源
你三大爷14 小时前
从 Hessian 迁移到 protostuff:深嵌套模型反序列化耗时与高并发类加载锁的根治实战
后端·架构
IT枫斗者枫哥14 小时前
子线程断言失败,JUnit 为什么还显示通过?
java·后端
stark张宇15 小时前
Vibe Coding 入门实战:用 Claude Code 跑通 AI 产品开发流程(上)
后端·claude·vibecoding
考虑考虑16 小时前
JDK27中的Set.ofLazy
java·后端·java ee