Maven中为什么有些依赖不用引入版本号

先给出一个例子:

<parent>
        <artifactId>sky-take-out</artifactId>
        <groupId>com.sky</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>sky-server</artifactId>
    <dependencies>

        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>



        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

    

      
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>


    </dependencies>

每个依赖都没有引入版本号,是因为:

从父 POM 继承了版本号

若项目有父 POM,并且父 POM 里定义了依赖的版本号,子项目就能够直接使用该依赖,无需再指定版本号。像上面给出的 POM 文件,就定义了父项目:

<parent>
    <artifactId>sky-take-out</artifactId>
    <groupId>com.sky</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

而这个父项目也有它的父项目:

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

Spring Boot 的 spring-boot-starter-parent POM 文件包含了 <dependencyManagement> 标签,此标签里定义了一系列常用依赖的版本。当项目继承自 spring-boot-starter-parent 时,就能使用这些预定义的版本,无需再次指定。

例如,在 spring-boot-starter-parent 的 <dependencyManagement> 部分,可能已经定义了 spring-boot-starter-web 的版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>3.3.4</version>
        </dependency>
        <!-- 其他依赖 -->
    </dependencies>
</dependencyManagement>

可以通过下面的方式查看 spring-boot-starter-parent 的 <dependencyManagement> 内容:

  1. 前往 Maven 中央仓库 搜索 spring-boot-starter-parent,找到对应版本(如 3.3.4)的 POM 文件。
  2. 查看 POM 文件中的 <dependencyManagement> 部分,了解所有预定义的依赖版本。
### 如何管理和配置Maven项目的依赖版本号 #### 使用`<version>`标签指定具体版本 在Maven项目中的`pom.xml`文件里,可以通过`<dependency>`元素下的`<version>`子元素来精确控制某个依赖的具体版本。例如: ```xml <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>example-artifact</artifactId> <version>1.0.0</version> </dependency> </dependencies> ``` 这种方式适用于希望固定使用特定版本的情况[^1]。 #### 利用版本区间表达灵活需求 对于那些不介意一定范围内自动升级至最新稳定版的情形,则可采用版本区间的写法。比如下面的例子表示接受7.x系列的所有发布版本(包括未来可能发布的更高次版本),但排除8.x及以上版本: ```xml <dependencies> <dependency> <groupId>com.configcat</groupId> <artifactId>configcat-java-client</artifactId> <version>[7.0.0,)</version> </dependency> </dependencies> ``` 这种做法有助于保持技术栈的新鲜度而不必频繁手动调整依赖声明[^4]。 #### 统一管理父级POM或BOM(Bill of Materials) 当面临多个模块共享相同依赖集时,推荐通过继承自共同父POM的方式集中定义这些公共组件及其版本信息;或者引入官方提供的Bill Of Material (BOM),从而简化跨模块的一致性维护工作量并减少重复劳动。例如Spring框架就提供了一个名为spring-framework-bom的特殊构件用于此类目的[^3]: ```xml <!-- 方法一:继承 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> </parent> <!-- 方法二:导入BOM --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 以上策略不仅能够有效降低因不同地方各自设定而导致潜在冲突的风险,同时也便于日后统一进行批量更新操作[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值