maven多模块依赖版本不一致问题

项目结构:

├─springcloud-alibaba

    ├─.idea
    ├─shop-common
    ├─shop-order
    ├─shop-product
    └─shop-user

项目环境:

父工程:

<properties>
    <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
    <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>

shop-common模块:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.56</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
</dependencies>

shop-product、shop-order、shop-user三个模块都引入了shop-common

在这里插入图片描述
除了shop-common模块之外,其他三个模块的mysql连接器依赖的版本都是8.0.15。
查阅资料后了解到这是maven的依赖原则的原因。

maven依赖原则:

最短路径原则 A -> B -> C -> D(V1)        F -> G -> D(V2)

    模块D重复引用依赖jar包,maven会自动选择最短的引用路径,所以模块D最后会选择V2版本的依赖。

 优先声明原则

    在引入依赖的时候直接声明版本则依赖使用当前版本。

    这次的问题就出在了maven的最短路径原则上,由于我的其他三个模块都是直接依赖于父工程的,引入了shop-common模块之后路径长了1,恰好父工程是一个springboot工程,里面已经默认配置了一个<mysql.version>8.0.15</mysql.version>,所以导致了其他三个模块都是使用的这个版本的依赖。

解决方案:

    在父工程中的properties标签锁定需要的版本依赖
<properties>
        <mysql.version>5.1.6</mysql.version>
</properties>

在这里插入图片描述
其他的maven依赖原则
MAVEN依赖的优先原则
maven依赖的优先原则
1.依赖最短路径优先原则
一个项目Demo依赖了两个jar包,其中A-B-C-X(1.0) , A-D-X(2.0)。由于X(2.0)路径最短,所以项目使用的是X(2.0)。
2.pom文件中申明顺序优先
如果A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样怎么办呢?这样的情况下,maven会根据pom文件声明的顺序加载,如果先声明了B,后声明了C,那就最后的依赖就会是X(1.0)。
3. 覆盖优先原则
子pom内声明的优先于父pom中的依赖。
原文连接

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Maven 是一个流行的 Java 构建工具,它通过命令行管理项目的构建、依赖和部署流程。当你想在一个 Maven 项目中引用其他 jar 包(Java Archive 文件)时,你可以使用特定的指令来添加依赖Maven 依赖管理主要通过 pom.xml 文件进行,这是 Maven 项目的配置文件,其中包含了项目及其依赖的信息。要添加外部库为依赖,你需要执行以下几个步骤: 1. **添加坐标**:首先,在`<dependencies>`标签内,为 jar 包定义一个 `dependency` 元素。这个元素包含两个重要属性: - `groupId`: 库的所有者(通常是组织名或个人 GitHub 用户名) - `artifactId`: 库的名字 - 可选地,还有 `version` 属性指定库的具体版本 ```xml <dependency> <groupId>com.example</groupId> <artifactId>library-name</artifactId> <version>1.0.0</version> </dependency> ``` 2. **引入本地仓库**:如果你已经有了 jar 包,可以通过 `<repository>` 标签将其放置到本地 Maven 仓库 (`~/.m2/repository/`) 中,这样 Maven 就能找到它们。 3. **使用 `mvn` 命令安装**: 如果你想从远程仓库下载并安装依赖,可以使用 `mvn install:install-file` 命令,提供本地路径和坐标信息。 4. **编译和打包**: 当你完成依赖设置后,可以使用 `mvn clean compile` 来编译项目,`mvn package` 来创建包含所有依赖的 JAR 文件。 例如,如果你想添加 Google Guava 库的依赖,可以在 pom.xml 如下添加: ```xml <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1-jre</version> </dependency> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗中的代码猿--刘同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值