解决SpringCloud下spring-boot-maven-plugin插件的打包问题

目录
  • 一、Maven生命周期、阶段、目标
  • 二、SpringCloud下spring-boot-maven-plugin插件的打包的问题
  • 三、SpringCloud正确的打包方式

一、Maven生命周期、阶段、目标

之前一直对Maven的3套生命周期有点不清楚,记录下自己的理解。
        生命周期,就是一个事物从初始到消亡、开始到结束的过程,而Maven的生命周期就是指Maven官方对项目执行Maven构建从开始使用到使用结束整个流程的定义。
        而所说的Mavn有3套生命周期,就是指Maven从开始使用到使用结束要经过3个生命周期的流程,这3个生命周期各自独立的,依次经过的生命周期分别是 clean、default、site,每个生命周期流程中也包含了不同的 phase(或者称作阶段),这些阶段也是有先后顺序的。可以说3套生命周期就是对这些阶段做的一个逻辑上划分、分类。

  • clean生命周期:因为项目如果是已经有部署过的话,我们肯定是要先把已经编译生成好的文件,要先清除掉。
  • default生命周期:然后执行一些测试、编译等步骤,default才是我们的重点,也是包含了最多的阶段。
  • site生命周期:最终发布到服务器上。

这样最终就形成了3套生命周期。当然以上的生命周期、阶段其实都是Maven官方自己所定义的一些逻辑上Maven项目应该经过的流程,并不一定每个项目都会经过这些所有的流程。而且用户可以通过自定义插件的方式,来将插件绑定到各个阶段,当我们在Maven执行命令的时候,就会执行自定义的特殊业务。
        比如对于spring-boot-maven-plugin,这个插件,我们使用这个插件的时候可以自定义该插件的phase为pre-clean。

mvn执行阶段的命令格式是:mvn 阶段1 [阶段2] [阶段n]。那么当执行mvn pre-clean命令,就会执行pre-clean阶段的流程,该流程在maven官方应该是没有执行任务逻辑的。我们可以对比下对一个项目执行pre-clean和clean的差别:只有clean的时候才多了实执行的delete的操作。

但是我们设置了这个<phase>pre-clean</phase>绑定后,我们执行pre-clean命令,自然就会执行到spring-boot-maven-plugin这个插件的逻辑。这里只是为了演示有绑定了pre-clean阶段的动作,实际项目上是不应该绑定到pre-clean阶段上的。

并且在一个阶段上也可以指定不同的goal/目标(可以称之为这个插件所提供的功能),一个插件可以提供多种不同的goal/目标/功能,在IDEA的Maven控制面板上打开该pom项目,可以看到这个spring-boot插件就是包含了这些目标:build-info、help、repackage、run、start、stop。

而我们上面配置了<goal>repackage</goal>,意味着在执行pre-clean阶段的时候,会实际执行到该插件的repackage这个目标。可以看到执行mvn pre-clean的结果,这个就是执行了repackage目标。在执行mvn命令可以指定要执行的目标,所以上面相当于执行了:mvn pre-clean:repackage

在clean这个生命周期中,Maven总共定义了三个阶段,分别是:pre-clean、clean、post-clean,各个阶段有先后顺序,执行某个阶段的时候会有序执行其前面的所有阶段。比如执行mvn post-clean,则依次执行pre-clean、clean、post-clean。可以看到当我们执行mvn post-clean的时候,也会出现了上面那样pre-clean时的错误

当我们在使用该插件的时候,没有定义phase的话,会自动使用其插件定义的时候用的defaultPhase。比如我们使用的spring-boot-maven-plugin没有配置phase,则默认的phase是插件源码RepackageMojo在@Mojo定义的参数defaultPhase,也就是package阶段了。所以我们只要增加了goal的配置,即使没有配置pahse,也可以在package阶段直接打包了

二、SpringCloud下spring-boot-maven-plugin插件的打包的问题

在SpringCloud项目中的spring-boot-maven-plugin配置如下:

当我们直接在SpringCloud项目下,对各个微服务子项目直接用命令mvn clean package打包会发现最终打出来的jar包并非可执行jar包,而只是我们项目源文件的普通jar包。

正确的打包命令应该是mvn clean package spring-boot:repackage,打包结果如下图。其中.original结尾的文件,就是项目源代码最初的jar包,然后springboot打包插件再根据该jar包再生成最终的可执行jar包。

三、SpringCloud正确的打包方式

为什么SpringCloud工程打可执行jar的命令是:mvn clean package spring-boot:repackage,而那些继承了spring-boot-starter-parent的项目可以直接通过mvn clean package就可以打可执行jar包?

这是因为在spring-boot-starter-parent的项目里已经帮我们将打包插件绑定到了repackage的目标,而该插件如上文所提到的,已经默认绑定到了package的阶段,所以当我们在SpringBoot项目执行mvn clean package的时候其实就自动执行了打普通jar包、并且通过repackage最终打成可执行jar包的流程。

所以如果我们的SpringCloud想要也能够像SpringBoot那样执行打包命令的话,可以在SpringCloud的父pom工程也定义好plugin的repackage目标:

这样在子工程执行package后,就可以发现已经可以自动执行打普通jar包的目标了,接着继续执行repackage目标,最终就是我们所要的可执行jar包。

如果只是单独执行mvn spring-boot:repackage,会报错:Source file must be provided。需要先package 与 spring-boot:repackage 在同一条命令执行才正确,可能插件内部是在通过本次命令执行中,根据package打出来的普通jar包的基础上进行repackage的,不会去获取仓库中已有的普通jar包。

到此这篇关于SpringCloud下spring-boot-maven-plugin插件的打包问题的文章就介绍到这了,更多相关spring-boot-maven-plugin插件打包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • maven springboot如何将jar包打包到指定目录

    目录 如何将jar包打包到指定目录 1.目的 2.修改pom 3.修改启动脚本 jar包外指定配置文件及原理 解决方案 运行 原理 如何将jar包打包到指定目录 今天分享一下springboot将jar包打包到指定目录下. 由于之前上线都是一个打包到一个jar,由于服务多了,1个包100多M,哪怕是小版本上线都需要重新上传jar包. 1.目的 将不常用的比如spring,druid等不常用打包到lib目录,这样每次上线不需要上传这些.第三方或者常改动的还打包到本身的jar包内,每次上线都会新打包

  • Spring Boot Maven Plugin打包异常解决方案

    [背景]spring-boot项目,打包成可执行jar,项目内有两个带有main方法的类并且都使用了@SpringBootApplication注解(或者另一种情形:你有两个main方法并且所在类都没有使用@SpringBootApplication注解),pom.xml如下 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin<

  • Springboot 整合maven插口调用maven release plugin实现一键打包功能

    maven release plugin配置 参考https://www.cnblogs.com/jiujixin/p/16003321.html 配置好pom. 整合maven-invoker使程序去执行mvn命令 1.导包 <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-invoker</artifactId> <version>3

  • springboot实现maven多模块和打包部署

    目录 创建多模块项目 依赖关系 开发工具 :idea 工程结构: 父工程father 子模块 dao (用于持久化数据跟数据库交互) 子模块 entity (实体类) 子模块 service (处理业务逻辑) 子模块 web (页面交互接收.传递数据,唯一有启动类的模块) 关系: web依赖 service.dao.entity service依赖 dao.entity dao依赖 entity entity谁都不依赖,独立的 创建多模块项目 new ------file-------proje

  • 解决IDEA中下载free maven plugin插件无效的问题

    在IDEA中导入插件时成功 但是在实体类的方法接口中没有绿色的箭头(我现在是有的) 解决方案一:鼠标右键,选择最后一个Configure Gutter Lcons 查看里面的东西是否已经勾选上,如果已经勾选上还是没有效果请看方案二 解决方案二:请不要心慈手软彻底的删除idea,在安装idea软件,在进行下载free MyBatis plugin插件,应该八九不离十应该有效果了 总结 到此这篇关于解决IDEA中下载free maven plugin插件无效的问题的文章就介绍到这了,更多相关IDEA

  • Spring Boot Maven插件使用详解

    Spring Boot Maven插件提供了使用Spring Boot应用程序步骤如下: 重新打包:创建一个可自动执行的jar或war文件.它可以替换常规工件,或者可以使用单独的分类器附加到构建生命周期. 运行:运行您的Spring引导应用程序与几个选项传递参数. 启动和停止:将Spring Boot应用程序集成到集成测试阶段,以便应用程序在其之前启动. 构建信息:生成可由致动器使用的构建信息. 重新打包一个应用程序 为了重新打包应用程序,只需要在pom.xml中添加对插件的引用,具体配置如下:

  • Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    目录 Spring Boot应用内存飙升 服务现状 JVM默认内存设置 优化 限制JVM内存 参数解释 JVM常见参数 java.security.egd 作用 优化后的Dockerfile文件 优化后的效果 JVM参数设置是否生效 基础镜像优化 OpenJ9 GraalVM Fabric8 优化后的Dockerfile文件 优化后的效果 备注 Xmx < limit 支持springboot多环境和jvm动态配置的Dockerfile 参考 Spring Boot应用内存飙升 一个简单的Spr

  • Spring Boot Maven 打包可执行Jar文件的实现方法

    Maven pom.xml 必须包含 <packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>

  • Spring Boot+maven打war包的方法

    存在一个坑: 官网文档 指出以下前3步做法,但是这样只可以打出可运行的jar包,要打出war包还要在文档后面的链接跳到另一个页面,才能找到第四步的做法,也就是最终能够打出war包,可能有些朋友有些粗心没找到第四步的链接,而以为只做了前三步就可以打出war包了,结果一直出错,还以为自己的业务代码有问题,然后一直瞎折腾,浪费很多时间(比如我),因此我把整个过程写于此. 1.指定war打包方式 <packaging>jar</packaging> 2.pom.xml添加spring-bo

  • 解决Idea启动Spring Boot很慢的问题

    同事win10启动Spring Boot工程只要3秒左右,我的启动要30秒.开始以为是CPU差距太大,后来才觉得不是这样! 解决方案 1. hostname命令查看自己的 hostname $ hostname 返回类似如下信息 aoedeMacBook-Pro.local 2. 修改host文件 sudo vim /etc/hosts 修改条目如下,注意分隔符是TAB!不是空格 127.0.0.1 localhost aoedeMacBook-Pro.local ::1 localhost a

  • Spring Boot 中PageHelper 插件使用配置思路详解

    使用思路 1.引入myabtis和pagehelper依赖 2.yml中配置mybatis扫描和实体类 这2行代码 pageNum:当前第几页 pageSize:显示多少条数据 userList:数据库查询的数据数据列表 PageHelper.startPage(pageNum, pageSize); PageInfo pageInfo = new PageInfo(userList); 最后返回一个pageInfo 对象即可,pageInfo 这个对象中只有数据一些信息,但是,没有成功失败的状

  • 解决SpringCloud下spring-boot-maven-plugin插件的打包问题

    目录 一.Maven生命周期.阶段.目标 二.SpringCloud下spring-boot-maven-plugin插件的打包的问题 三.SpringCloud正确的打包方式 一.Maven生命周期.阶段.目标 之前一直对Maven的3套生命周期有点不清楚,记录下自己的理解.        生命周期,就是一个事物从初始到消亡.开始到结束的过程,而Maven的生命周期就是指Maven官方对项目执行Maven构建从开始使用到使用结束整个流程的定义.        而所说的Mavn有3套生命周期,就

  • Spring Boot maven框架搭建教程图解

    摘要:让Spring应用从配置到运行更加快速,演示DIY Spring Boot框架时,如何配置端口号,如何添加日志. Spring Boot 框架帮助开发者更容易地创建基于Spring的应用程序和服务,使得开发者能够快速地获得所需要的Spring功能.提供了非功能性的大型项目类特性,如(如内嵌服务器.安全.度量.健康检查.外部化配置),内部封装了tomcat的一些核心jar包,将发布封装了,因此不需要将项目(war包)发布到外部tomcat上. 可以在Spring Boot官网 https:/

随机推荐