Java-SpringBoot-10-Spring Boot Maven Plugin-01

简介: Spring Boot Maven Plugin 是什么呢?Spring Boot Maven Plugin 是什么呢?

Spring Boot Maven Plugin 是什么呢?

       Spring Boot Maven Plugin是Apache Maven的一个Spring Boot的Maven插件,为Spring Boot应用提供了执行Maven操作的可能。

        Spring Boot Maven Plugin能够将Spring Boot应用打包为可执行的jar或war文件,并且能够以通常的方式运行执行springboot应用。


Spring Boot Maven Plugin 可以干些啥?

       Spring Boot Maven Plugin 可以将项目打包可执行的jar或war归档文件,运行Spring Boot应用程序,生成构建信息以及在运行集成测试之前启动Spring Boot应用程序。


Spring Boot Maven plugin的最主要goal就是repackage。

       Maven首先在package阶段打包生成*.jar文件,查找Manifest文件中配置的Main-Class属性,再次执行spring-boot:repackage重新打包为可执行的软件包,并将mvn package生成的软件包重命名为*.original。

可以看到生成的两个jar文件,一个是*.jar,另一个是*.jar.original。


普通jar和Spring Boot Maven Plugin 构建的jar有啥区别呢?

       springboot-maven-plugin打的jar包里包含了第三方依赖,而maven的源jar是不包含依赖的。

image.png

根据解压插件打的包结构对比看maven的源 jar的区别:

  • 源 jar 中主项目的 .class 文件被移至 fatjar 的 BOOT-INF/classes 文件夹下。
  • 新增 BOOT-INF/lib 文件夹,里面存放三方 jar 文件。
  • 新增 BOOT-INF/classpath.idx,用来记录 classpath 的加载顺序。
  • 新增 org/springframework/boot/loader 文件夹,这是 spring-boot-loader 编译后的 .class 文件。
  • 清单文件 MANIFEST.MF中新增以下属性:
  • Spring-Boot-Classpath-Index: 记录 classpath.idx 文件的地址。
  • Start-Class: 指定 Spring Boot 的启动类。
  • Spring-Boot-Classes: 记录主项目的 .class 文件存放路径。
  • Spring-Boot-Lib: 记录三方 jar 文件存放路径。
  • Spring-Boot-Version: 记录 Spring Boot 版本信息
  • Main-Class: 指定 jar 程序的入口类(可执行 jar 为 org.springframework.boot.loader.JarLauncher类)。


Spring Boot Maven plugin的5个Goals

  • spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin
  • spring-boot:run,运行Spring Boot应用
  • spring-boot:start,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • spring-boot:stop,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • spring-boot:build-info,生成Actuator使用的构建信息文件build-info.properties



使用

       1.如果POM是继承spring-boot-starter-parent的话,parant已经有了默认的配置,已经可以直接使用了。

要将您的项目配置为继承自spring-boot-starter-parent,请设置parent如下:<!--InheritdefaultsfromSpringBoot--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0-RC1</version></parent>

只需要为此依赖项指定Spring Boot版本号2.5.0-RC1。如果导入其他启动器,则可以安全地省略版本号。如果要是自定义的话,直接添加配置去覆盖就可以了。比如:通过覆盖自己项目中的属性来覆盖各个依赖项。

例如,要使用不同版本的SLF4J库和Spring Data发布系列,您可以将以下内容添加到您的pom.xml:

<properties><java.version>1.8</java.version><start-class>com.myproject.PortalutilApplication也就是你启动类的全类名</start-class><slf4j.version>1.7.30</slf4j.version><spring-data-releasetrain.version>Moore-SR6</spring-data-releasetrain.version></properties>

spring-boot-starter-parent项目配置的默认值提供以下功能:

  • Java 1.8是默认的编译器级别。
  • UTF-8源编码。
  • 从spring-boot-dependenciesPOM继承的依赖性管理部分,用于管理常见依赖性的版本。这种依赖性管理使您可以<version>在自己的POM中使用时省略那些依赖性的标签。
  • 具有执行ID的repackage目标的repackage执行。
  • 明智的资源过滤。
  • 明智的插件配置(Git commit ID和shade)。
  • 针对application.properties和application.yml包括特定于配置文件的文件(例如application-dev.properties和application-dev.yml)进行明智的资源过滤

嗯 不如直接看一眼2.4.5版本源码:

<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"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.4.5</version></parent><artifactId>spring-boot-starter-parent</artifactId><packaging>pom</packaging><name>spring-boot-starter-parent</name><description>ParentpomprovidingdependencyandpluginmanagementforapplicationsbuiltwithMaven</description><properties><java.version>1.8</java.version><resource.delimiter>@</resource.delimiter><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.target>${java.version}</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><url>https://spring.io/projects/spring-boot</url><licenses><license><name>ApacheLicense, Version2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0</url></license></licenses><developers><developer><name>Pivotal</name><email>info@pivotal.io</email><organization>PivotalSoftware, Inc.</organization><organizationUrl>https://www.spring.io</organizationUrl></developer></developers><scm><url>https://github.com/spring-projects/spring-boot</url></scm><build><resources><resource><directory>${basedir}/src/main/resources</directory><filtering>true</filtering><includes><include>**/application*.yml</include><include>**/application*.yaml</include><include>**/application*.properties</include></includes></resource><resource><directory>${basedir}/src/main/resources</directory><excludes><exclude>**/application*.yml</exclude><exclude>**/application*.yaml</exclude><exclude>**/application*.properties</exclude></excludes></resource></resources><pluginManagement><plugins><plugin><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-maven-plugin</artifactId><version>${kotlin.version}</version><configuration><jvmTarget>${java.version}</jvmTarget><javaParameters>true</javaParameters></configuration><executions><execution><id>compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>test-compile</id><phase>test-compile</phase><goals><goal>test-compile</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><parameters>true</parameters></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-failsafe-plugin</artifactId><executions><execution><goals><goal>integration-test</goal><goal>verify</goal></goals></execution></executions><configuration><classesDirectory>${project.build.outputDirectory}</classesDirectory></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><mainClass>${start-class}</mainClass><addDefaultImplementationEntries>true</addDefaultImplementationEntries></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><archive><manifest><mainClass>${start-class}</mainClass><addDefaultImplementationEntries>true</addDefaultImplementationEntries></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><propertiesEncoding>${project.build.sourceEncoding}</propertiesEncoding><delimiters><delimiter>${resource.delimiter}</delimiter></delimiters><useDefaultDelimiters>false</useDefaultDelimiters></configuration></plugin><plugin><groupId>pl.project13.maven</groupId><artifactId>git-commit-id-plugin</artifactId><executions><execution><goals><goal>revision</goal></goals></execution></executions><configuration><verbose>true</verbose><dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat><generateGitPropertiesFile>true</generateGitPropertiesFile><generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions><configuration><mainClass>${start-class}</mainClass></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><configuration><keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope><createDependencyReducedPom>true</createDependencyReducedPom><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters></configuration><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.5</version></dependency></dependencies><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"><resource>META-INF/spring.factories</resource></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>${start-class}</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></pluginManagement></build></project>

2.可能需要使用自己的公司标准父级,或者可能希望显式声明所有Maven配置,那么就不继承spring-boot-starter-parentPOM。要使用Spring Boot Maven插件,就得自己在XML pom.xml的plugins部分中包含以下示例所示:

<project><modelVersion>4.0.0</modelVersion><artifactId>getting-started</artifactId><!-- ... --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

这样直接对项目进行打包的时候,就会使用配置好的spring-boot-maven-plugin来打包构建了。

      下期见!

目录
相关文章
|
2月前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
53 0
|
3月前
|
Java Maven
java修改当前项目的maven仓库地址为国内
修改当前项目的maven仓库地址为国内
|
2月前
|
Web App开发 Java 测试技术
《手把手教你》系列基础篇之(四)-java+ selenium自动化测试- 启动三大浏览器(下)基于Maven(详细教程)
【2月更文挑战第13天】《手把手教你》系列基础篇之(四)-java+ selenium自动化测试- 启动三大浏览器(下)基于Maven(详细教程) 上一篇文章,宏哥已经在搭建的java项目环境中实践了,今天就在基于maven项目的环境中给小伙伴们 或者童鞋们演示一下。
71 1
|
4月前
|
Java API Maven
JFinal5+Jetty2009+IDEA2020+Java8的非Maven-Demo项目
JFinal5+Jetty2009+IDEA2020+Java8的非Maven-Demo项目
22 1
|
4月前
|
XML Java 项目管理
java maven 和gradle哪种好
java maven 和gradle哪种好
82 0
|
4月前
|
Java Maven
java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator
java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator
26 1
|
8天前
|
Java Maven
Maven 构建 Java 项目
使用Maven的`maven-archetype-quickstart`插件在C:\MVN下创建Java应用,命令包括`groupId`, `artifactId`, 和 `archetypeArtifactId`参数。生成的项目包含src/main/java和src/test/java目录,分别用于存放源代码和测试代码,还有src/main/resources用于资源文件。默认提供App.java主类和AppTest.java测试类。按照预设结构组织文件,Maven将自动管理构建过程。
|
11天前
|
Java 测试技术 项目管理
Java基础教程(22)-构建工具Maven的基本使用
【4月更文挑战第22天】Maven是Java项目管理及构建工具,简化构建、测试、打包和部署等任务。遵循约定优于配置原则,核心是`pom.xml`配置文件,用于管理依赖和项目信息。安装涉及下载、解压、配置环境变量。在IDEA中使用Maven创建项目,通过`pom.xml`添加依赖和管理版本。常用命令包括`clean`、`compile`、`test`、`package`、`install`和`deploy`。IDEA支持直接执行这些命令。
|
23天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
29 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
25天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
【Spring系列】Sping VS Sping Boot区别与联系

推荐镜像

更多