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间接依赖内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • maven依赖关系中的<scope>provided</scope>使用详解

    关于maven依赖中的<scope>provided</scope>使用 scope的其他参数如下: compile 默认的scope,表示 dependency 都可以在生命周期中使用.而且,这些dependencies 会传递到依赖的项目中.适用于所有阶段,会随着项目一起发布 provided 跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs.这个scope 只能作用在编译和测试时,同时没有传递性

  • Maven如何构建可执行的jar包(包含依赖jar包)

    目标: 将依赖的第三方jar包打进去 方法: maven-assembly-plugin 环境: IDEA 2016.3 JDK 1.8 遇到的问题: 此处耗时2天时间,遇到过的坑: 1.修改完pom.xml后,不生效. --改pom.xml后,代码不生效,是因为对IDEA工具不熟,在修改完xml后,需要点工具右下角的import changes或者直接点auto-import就可以一劳永逸了. 2.生成jar后,idea可以执行,但是java -jar无法执行,报错Exception in t

  • 深入理解Maven的坐标与依赖

    在前边两节中,我们学习了Maven的基本概念以及何为Maven仓库,并且如何配置settings.xml文件等相关知识点.Maven的主要作用是可以帮助我们自动下载在pom.xml中配置添加的依赖.那么在本节中,我们将学习如何引入依赖. 知识点包括: Maven的坐标,Maven的依赖配置,依赖范围,传递性依赖,依赖调解,可选依赖,排除依赖,归类依赖和优化依赖 Maven的坐标 Maven的仓库中拥有着无数的构件,每一个构件都是一个jar或者war等文件,如果没有坐标,那么我们将无法唯一标识该构

  • 详解maven依赖冲突以及解决方法

    什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的.每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突 如何解决依赖冲突 首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了.具体执行步骤如下 1.查看依赖冲突 a.通过dependency:tree是命令来检查版本冲突 mvn -Dverbose dep

  • Maven配置项目依赖使用本地仓库的方法汇总(小结)

    Maven配置项目使用本地仓库有以下方式实现: 1.类似本地仓库,但是属于本地依赖,比如某个JAR包是引用第三方的,直接放在了项目的lib文件夹,那么此时可以如下配置项目的POM: <dependency> <groupId>ldapjdk</groupId> <artifactId>ldapjdk</artifactId> <scope>system</scope> <version>1.0</vers

  • IDEA中Maven依赖下载失败的完美解决方案

    使用IDEA进行Maven项目开发时,时不时会遇到pom.xml报错的情况,其中很大概率是因为Maven依赖的jar包下载失败,找来找去也没有找到是什么问题,困扰了很多程序猿,这里给出IDEA中Maven依赖下载失败解决方案,给大家参考,实测有用. 文章目录首先检查网络有没有问题,确定网络没有问题,请看下一步多次点击重新导入Maven依赖的按钮设置自动导入Maven依赖在IDEA中找到Maven的配置文件的地址,然后检查配置的远程仓库或者镜像有没有问题如果上面几步都没有解决问题,可以使用以下脚本

  • Maven最佳实践之一个好的parent依赖基础

    使用parent 控制依赖版本是很常见的事. 如果你有过控制依赖版本的这种经历,你可能就会遇到过第三方版本之间的冲突,本文不介绍如何解决冲突,但是会提供给你一个基本不存在冲突的基础依赖. 得益于 Spring ,尤其是 Spring Boot 对第三方集成提供的 starter.Spring Boot 对可能用到的第三方依赖提供了很好的版本控制,我们就依靠 Spring 提供的 bom 和 dependencies 来实现我们自己的基础依赖. 由于 Spring Boot 2.0 正式版还没有发

  • IDEA 重新导入依赖maven 命令 reimport的方法

    Intellj 的自动载入maven功能有时候很好用,但是有时候会碰到很多问题,导致pom文件修改却没有触发自动重写载入.此时需要手动强制更新依赖: 1. 手动删除Project Setting 里面的libraries 包 2. 在Maven Project点击clean功能,删除之前编译过得文件 3. 项目右键 --> maven --> Reimport 总结 到此这篇关于IDEA 重新导入依赖maven 命令 reimport的文章就介绍到这了,更多相关idea maven 命令 re

  • maven项目如何依赖自定jar包

    这篇文章主要介绍了maven项目如何依赖自定jar包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在开发中经常会出现maven项目需要依赖一个自定义jar包,但是这个jar包并没有在maven仓库中,就会出现打包时找不到jar包的问题,解决办法如下: 在这个模块中,lib下的jar包是我自己定义的,maven仓库中并没有,在pom文件中添加jar包时,做以下处理 这样打包时就能找到包的位置了 以上就是本文的全部内容,希望对大家的学习有所帮助,

  • Springboot的maven间接依赖的实现

    在项目中经常使用 maven 来管理项目,但是有时候对于 maven 的细节还是了解的不是很清楚,因此今天复习下. maven项目 首先开始建立一个最简单的 maven 项目,其配置如下图: 可以看到最上面一行是 xml 的文件描述符,然后再是 project,在这里引入 xsd 文件. XSD(XML Schemas Definition)XML Schema,描述了 xml 文档的结构,用于判断其是否符合 xml 的格式要求 然后下面就是 groupId,通常是公司的域名,artifactI

  • spring boot的maven配置依赖详解

    本文介绍了spring boot的maven配置依赖详解,分享给大家,具体如下: 我们通过引用spring-boot-starter-parent,添加spring-boot-starter-web 可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖包也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突.我们来看下springboot的依赖配置: 利用pom的继承,一处声明,处处使用.在最顶级的spring-boot-dependen

  • springboot 打包部署 共享依赖包(分布式开发集中式部署微服务)

    1.此文初衷 平常我们在进行微服务开发完毕后,单个微服务理应部署单个虚机上(docker也可),然后服务集中发布到服务注册中心上,但是有些小的项目,这样做未免太过繁杂增加了部署难度,这里主要讲述的是如何在单机上通过共享jar包的方式来部署多个微服务,解决以上部署难度同时在带宽不够或者网速慢的情况下如何快速的发布部署. 2.部署目录结构   部署目录解答-> 各个微服务与依赖包(lib文件夹下)在同一级目录下,此为图1内容.图二内容展示的是单个微服务内的文件结构,部署配置文件以及所打的jar包,这

  • SpringBoot项目没有把依赖的jar包一起打包的问题解决

    这篇文章主要介绍了SpringBoot项目没有把依赖的jar包一起打包的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一般未一起打包是因为pom不是继承自spring-boot-starter-parent导致的需要在pom.xml文件写入以下配置 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

  • SpringBoot加载外部依赖过程解析

    这篇文章主要介绍了SpringBoot加载外部依赖过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景 公司一个项目的大数据平台进行改造,之前使用Structured Streaming作为实时计算框架,需要替换为替换为Kafka Streams,并使用SpringBoot包装,使其可以纳入微服务体系. 然而由于之前并没有接触过SpringFramework相关技术,并且项目工期较为紧张,因此只好花了2天时间看了看Spring和Spri

  • 基于SpringBoot构造器注入循环依赖及解决方式

    1. 循环依赖是什么? Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖. Bean A → Bean B → Bean A 更复杂的间接依赖造成的循环依赖如下. Bean A → Bean B → Bean C → Bean D → Bean E → Bean A 2. 循环依赖会产生什么结果? 当Spring正在加载所有Bean时,Spring尝试以能正常创建Bean的顺序去创建Bean. 例如,有如下依赖: Bean A → Bean B → Bean C Spring

  • SpringBoot中maven项目打成war包部署在liunx服务器上的方法

    说明:Spring Boot由于内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再像Spring项目还需要外置的Tomcat等容器来进行部署工作了,通过启动启动类就可以建立独立的Spring应用程序.Spring Boot部署在服务器上主要分为两种方式:一是打成jar包发布,二是打成war包发布,第一种方式只需要在该服务器中运行java -jar+部署项目的名称就可以启动(不要忘了.jar后缀名),操作比较简单,第二种方式操作比较复杂一点,并且是项目发

  • SpringBoot使用Maven打包异常-引入外部jar的问题及解决方案

    由于项目需要,在需要打包的时候,由于引入的外部jar在本地是可以使用的,但是当打包后启动时报错,找不到对应的类. 使用 1.引入外部jar包 项目中简历文件夹lib 可以在resultces包下简历一个lib文件夹,将jar包扔进去: 在配置文件中引用 <dependency> <groupId>com.xx.xxx</groupId> //组织,随便命名 <artifactId>***</artifactId> //包的名字,随便命名 <

  • springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试)

    创建之前项目之前 记得改一下 maven  提高下载Pom速度 记得 setting 中要改 maven  改成 阿里云的.具体方法 网上查第一步 搭建parents 项目,为maven项目 ,不为springboot 项目 记得修改groupId 第二步 搭建多个子模块, honor-dao   honor-manager   honor-common记得创建 honor-manager 的时候 要把他的gruopId 改成com.honor.manager 这里爆红的原因是 因为 我做到后面

  • SpringBoot使用Maven插件进行项目打包的方法

    SpringBoot自带Tomcat,所以我们的项目可以单独部署,不需要依赖Window.Linux系统中的服务器,所以打包出来的Jar包是可以直接运行的.Windows中直接cmd命令行模式下,cd切换到jar路径中,使用java 命令运行jart包,Linux环境也是一样的命令,如下图: 现在我们开始打包,我介绍两种方式,不管那种方式首先先在项目Pom.xml文件中引入Maven插件. <build> <plugins> <!-- 设置jdk版本为1.8 --> &

随机推荐