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继承的依赖性管理部分,用于管理常见依赖性的版本。这种依赖性管理使您可以在自己的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来打包构建了。

      下期见!

目录
相关文章
|
5月前
|
Java Maven 容器
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
|
2月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
62 2
|
3月前
|
Java 关系型数据库 MySQL
Maven——创建 Spring Boot项目
Maven 是一个项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,简化了项目的构建和管理过程。其核心功能包括项目构建和依赖管理,支持创建、编译、测试、打包和发布项目。Maven 仓库分为本地仓库和远程仓库,远程仓库包括中央仓库、私服和其他公共库。此外,文档还介绍了如何创建第一个 SpringBoot 项目并实现简单的 HTTP 请求响应。
277 1
Maven——创建 Spring Boot项目
|
3月前
|
Java 关系型数据库 MySQL
如何使用 maven 创建一个 Spring Boot项目
Maven 是一个强大的项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,提高开发效率。其核心功能包括项目构建和依赖管理。项目构建支持编译、测试、打包和发布等流程,而依赖管理则通过中央仓库、本地仓库和私有服务器获取和管理项目依赖。示例中展示了如何创建第一个 SpringBoot 项目并实现简单接口。
72 1
如何使用 maven 创建一个 Spring Boot项目
|
3月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
111 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
Java Maven Android开发
【Azure Developer】VS Code打包Java maven Project 遇见 BUILD FAILURE
Unknown lifecycle phase "lean". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
|
2月前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
80 0
|
3月前
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
180 4
|
3月前
|
Java 应用服务中间件 Maven
idea+maven+tomcat+spring 创建一个jsp项目
这篇文章介绍了如何在IntelliJ IDEA中使用Maven和Tomcat创建一个JSP项目,包括配置Maven依赖、设置Tomcat服务器、编写JSP页面、创建控制器和配置文件,以及项目的运行结果。
274 0
idea+maven+tomcat+spring 创建一个jsp项目
|
3月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
100 2