记录一次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>
相关推荐
二妹的三爷8 小时前
私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)
spring boot·后端·ui
神奇小汤圆8 小时前
程序员面试必备的Java八股文,适合所有的Java求职者
后端
覆东流8 小时前
第3天:Python print深入与格式化输出
开发语言·后端·python
StockTV8 小时前
SpringBoot对接黄金白银期货数据API
java·spring boot·后端
techdashen8 小时前
Rust 正式成立 Types Team:类型系统终于有了专属团队
开发语言·后端·rust
小谢小哥8 小时前
43-Kafka 核心原理与实战
后端·架构
金銀銅鐵9 小时前
[git] 如何找到已经“丢失”的 commit?
git·后端
消失的旧时光-19439 小时前
Spring Boot 核心机制之 @Conditional:从原理到实战(一次讲透)
java·spring boot·后端
huabiangaozhi9 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
fliter9 小时前
Rust 1.88 终于稳定了裸函数:写汇编不再需要那堆样板代码
后端