立足于核心技术的平台研发

springboot学习笔记——固化的Maven依赖机制

springboot应用创建需要引入Maven依赖:org.springframework.boot:spring-boot-starter-web,org.springframework.boot:spring-boot-loader等。spring starter的版本信息继承自org.springframework.boot:spring-boot-starter-parent,这是Maven管理的继承特性,降低了spring boot应用管理依赖的成本。这样说,有点令人费解。捋一下思路,赖于Maven等jar包依赖管理工具的支撑,springboot应用在构建时往往只需维护spring-boot-starter-parent的版本,其他继承自spring-boot-starter-parent的包可以不必显式声明版本号等信息(具体哪些信息自己试)。但是由于实现继承的方式通过parent元素声明唯一的父包,属于单继承方式,在错综复杂的开发场景下需要“集百家之长”的需求是无法通过简单的单继承表达清楚“各路诸侯”的长幼尊卑等继承依赖关系的,这成为固化Maven依赖的制约因素,何况具体应用的pom.xml定义自家的Parent元素属于家常便饭。 这样的话,这种依靠单继承实现的依赖管理方案显然不能够搞定复杂依赖的关系成为一个问题,基于这种现象,Maven等依赖管理工具推出了单继承之外的方案:依赖管理,希望用这种支持嵌套覆盖的表达方式定义和厘清开发项目的依赖网络。

在Maven中,依赖管理的实现是通过标签dependencyManagement在pom.xml中发挥作用的,在声明了parent的同时,依然可以通过此种方式声明作用域scope为import的依赖包。这是一种在当前应用的pom中导入某个或某些个pom的方式,姑且叫做联合依赖吧。这种联合依赖方式,不同于插件管理,插件管理是附加某些个插件的声明,然后打包时附带上所声明的插件包,而这种方式被联合的构件可以包含其他的联合依赖,就是支持嵌套,从而以一棵树的形式组织整个应用涉及到的所有依赖单元。这种联合依赖,会作为高优先级的依赖声明,这个依赖的pom中可能包含一些个包或插件是在上下文中存在的,对于这些不速之客,必然导致版本冲突,解决办法是在插件管理中对冲突的插件包展开显式的声明,告诉上下文本应用在这个冲突上明确的版本,这样打包时就会排除掉未被声明的插件包了,本人不喜欢马瘟(maven)故理解粗浅,大概齐这个意思吧,如有谬误还请指出!说了那么多,附上spring-boot-starter-parent和spring-boot-dependencies的pom定义:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath>../spring-boot-dependencies</relativePath>
</parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.0.2.RELEASE</version>
<packaging>pom</packaging>
...
<prerequisites>
  <maven>3.5</maven>
</prerequisites>
</project>
<?xml version="1.0" encoding="utf-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.2.RELEASE</version>
    <packaging>pom</packaging>
    <name>Spring Boot Dependencies</name>
    <description>Spring Boot Dependencies</description>
    ...
<properties>
        <activemq.version>5.15.3</activemq.version>
        <antlr2.version>2.7.7</antlr2.version>
        <appengine-sdk.version>1.9.63</appengine-sdk.version>
        <artemis.version>2.4.0</artemis.version>
        <aspectj.version>1.8.13</aspectj.version>
        ...
        <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
        <maven-war-plugin.version>3.1.0</maven-war-plugin.version>
        ...
</properties>
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <version>2.0.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-test</artifactId>
                <version>2.0.2.RELEASE</version>
            </dependency>
            ...
</dependencies>
    </dependencyManagement>
    <build>
        <pluginManagement>
            <plugins>
            ...
               <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.0.2.RELEASE</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>${maven-jar-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>${maven-war-plugin.version}</version>
                </plugin>
             </plugins>
        </pluginManagement>
    </build>
</project>

以上pom定义从形式上表达了spring boot利用maven的依赖管理所做的固化声明,形成spring boot的参天大树。至于更深层次的用法和规约,是由定义者和逻辑体系决定的,不再赘述。

上一篇

相关文章

在线留言

*

*

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

电话:18660802028