Springboot的maven间接依赖的实现

 更新时间:2020年05月21日 08:49:53   作者:Somersames  
这篇文章主要介绍了Springboot的maven间接依赖的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在项目中经常使用 maven 来管理项目,但是有时候对于 maven 的细节还是了解的不是很清楚,因此今天复习下。

maven项目

首先开始建立一个最简单的 maven 项目,其配置如下图:

可以看到最上面一行是 xml 的文件描述符,然后再是 project,在这里引入 xsd 文件。

XSD(XML Schemas Definition)XML Schema,描述了 xml 文档的结构,用于判断其是否符合 xml 的格式要求

然后下面就是 groupId,通常是公司的域名,artifactId 通常指的是项目名称。

Springboot项目

按照官方的指导,在项目中首先引用 spring-boot-starter-parent,修改后的 pom.xml 如下:

<?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.example</groupId>
  <artifactId>maven-test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
  <finalName>maven-test</finalName>
</build>
</project>

当准备在启动类上加 @SpringBootApplication 注解的时候,此时 IDEA 会提示找不到这个注解。这是正常的,因为 parent 只是把这个项目的配置和依赖信息统一化了,使得 子pom 就不用关心版本问题,例如在项目中引入spring-boot-starter-web,当配置了 parent 之后,只需要在 子pom 中如下配置:

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

那么它的配置信息就会自动的从 parent 中读取。例如刚刚的spring-boot-starter-web信息,它的版本信息如下:

tips:使用命令mvn -Dverbose dependency:tree就可以像这样打印 jar 的依赖

那么 springboot 又是怎样来自动识别版本号的呢,此时就就涉及到了spring-boot-dependencies

spring-boot-dependencies

spring-boot-dependenciesspring-boot-starter-parent 的一个 parent,可以在 spring-boot-starter-parentpom 文件中看到。

打开 spring-boot-dependencies 文件,你会发现它里面几乎全部都是一些配置信息,而刚刚的spring-boot-dependencies 版本号就是来自于此。

到目前为止,可以基本理清 springboot 的依赖关系了。

打包

在工程中,随便写一个 controller,然后执行mvn package,此时会在 target 目录下出现一个 jar 包,然后运行 jar 包,正常启动OK。

替换parent

既然 spring-boot-starter-parent 是依赖于 spring-boot-dependencies的,那么可不可以直接将parent 设置为spring-boot-dependencies呢,修改 pom 文件如下:

然后执行mvn package,执行的时候是成功的,但是当你用 java -jar maven-test.jar 的时候,你会发现提示如下:

target java -jar maven-test.jar
maven-test.jar中没有主清单属性

原因

首先分析下两个的 maven log。

spring-boot-starter-parent作为parent

spring-boot-dependencies作为parent

可以看到第二次的打包插件是 maven-jar-plugin,也就是说 springboot 的项目一些资源并没有打包进来,查看 spring-boot-maven-plugin 插件,发现它是来自于 spring-boot-starter-parent 里面的,但是在文章的开头部分,是已经手动的将其引入到了 pom 文件,那么修改 parent 以后未执行的话,最有可能就是版本号的缺失导致的,于是修改pom:

 <plugins>
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.1.11.RELEASE</version>
  </plugin>
</plugins>
<finalName>maven-test</finalName>

然后运行mvn package

[INFO] --- spring-boot-maven-plugin:2.1.11.RELEASE:repackage (repackage) @ maven-test ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

你会发现此时打包出来的 jar 文件已经可以运行了。

进阶

那么假设项目已经有了自己的 parent,如果还想用 spring-boot-dependencies 来进行统一的一个全局版本控制,那么有如下的解决办法

在自己的parent中设置parent为 spring-boot-starter-parent,那么根据 maven 的继承属性,所有的 子pom 也就顺带继承了 spring-boot-starter-parent

到此这篇关于Springboot的maven间接依赖的文章就介绍到这了,更多相关Springboot的maven间接依赖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MybatisPlus分页失效不起作用的解决

    MybatisPlus分页失效不起作用的解决

    在使用MybatisPlus的selectPage时发现分页不起作用,每次返回的都是全部的数据,本文就来介绍一下MybatisPlus分页失效不起作用的解决,感兴趣的可以了解一下
    2024-03-03
  • SpringBoot批处理的实现示例

    SpringBoot批处理的实现示例

    SpringBatch是一个开源 的、全面的、轻量级的批处理框架,通过SpringBoot可以实现强大的批处理应用程序开发,本文主要介绍了SpringBoot批处理的实现示例,感兴趣的可以了解一下
    2022-03-03
  • 23种设计模式(20)java中介者模式

    23种设计模式(20)java中介者模式

    这篇文章主要为大家详细介绍了23种设计模式之java中介者模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java多态的全面系统解析

    Java多态的全面系统解析

    多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定
    2022-03-03
  • 浅谈使用java实现阿里云消息队列简单封装

    浅谈使用java实现阿里云消息队列简单封装

    这篇文章主要介绍了浅谈使用java实现阿里云消息队列简单封装,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • spring security认证异常后返回中文提示的问题

    spring security认证异常后返回中文提示的问题

    这篇文章主要介绍了spring security认证异常后返回中文提示的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • java生成excel并导出到对应位置的方式

    java生成excel并导出到对应位置的方式

    这篇文章主要介绍了java生成excel并导出到对应位置的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java线程池队列LinkedTransferQueue示例详解

    Java线程池队列LinkedTransferQueue示例详解

    这篇文章主要为大家介绍了Java线程池队列LinkedTransferQueue示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • java实现简单聊天室单人版

    java实现简单聊天室单人版

    这篇文章主要为大家详细介绍了java实现简单聊天室的单人版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 使用JavaBean根据指定条件设置属性值默认值方式

    使用JavaBean根据指定条件设置属性值默认值方式

    这篇文章主要介绍了使用JavaBean根据指定条件设置属性值默认值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论