普通maven项目
maven导入依赖时,可以省略版本号吗?
答案是不可以。maven坐标三要素gav缺一不可。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.4</version>
</dependency>
为什么很多时候没有看到版本号?
举个例子:Jackson是一个处理JSON的类库,它可以进行JSON和Java对象转换,核心模块由三部分组成,
其中databind包含了annotations和core的依赖,只需要导入databind即可。
- jackson-databind
- jackson-annotations
- jackson-core
jackson-core的依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version.annotations}</version>
</dependency>
jackson-annotations的依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version.core}</version>
</dependency>
为什么这两个依赖都没写版本号?
在spring中,用${}可以取xml文件的properties标签里的内容,说明版本号写在databind上了。
<parent>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-base</artifactId>
<version>2.10.4</version>
</parent>
databind里有一段parent标签,点进去
<parent>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>2.10.4</version>
</parent>
发现又有一段parent标签,再点进去
复习一下dependencyManagement的用法:
dependencyManagement 元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。
再看看依赖中还有什么
原来版本号全都写死了,当你决定引入2.10.4的
jackson-databind时,其他相关的依赖的版本号写的都是2.10.4
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.4</version>
</dependency>
springboot项目-版本仲裁中心
新建一个新的springboot项目,然后添加两个依赖
- jackson-databind
- spring-boot-starter
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
没有写版本号居然也没报错!
而且我测试了下,可以正常java对象转json对象。
查看maven,显示了版本号。
肯定是偷偷在哪个地方加上了版本号,嫌疑最大就是——创建springboot时自带的parent
点进去,看看有什么东西
描述上说:Panent是来管理依赖和插件的,具体怎么管理的呢?点进去继续查看
看到propreties,不出所料就是它了。
propreties标签指定了最里面的jackson.version的版本号
请注意:pom文件的maven坐标我只填了ga,没有填version。说明真正发挥作用的是dependencyManagement 版本仲裁中心。
dependencyManagement 元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。
结论:maven坐标中是不能省略版本号的。当没看到版本号时,可能是以dependencyManagement的方式藏在版本仲裁中心。
spring-boot-starter-web依赖启动器的主要作用是提供Web开发场景所需的底层所有依赖。
所以,在pom.xml中引入spring-boot-starter-web依赖启动器时,就可以实现Web场景开发,而不需要额外导入Tomcat服务器以及其他Web依赖文件等。当然,这些引入的依赖文件的版本号还是由spring-boot-starter-parent父依赖进行的统一管理。
其中就有jackson,在springboot中可以直接使用。