- build-info:生成项目的构建信息文件 build-info.properties
- repackage:这个是默认 goal,在
mvn package
执行之后,这个命令再次打包生成可执行的 jar,同时将mvn package
生成的 jar 重命名为*.origin
- run:这个可以用来运行 Spring Boot 应用
- start:这个在
mvn integration-test
阶段,进行Spring Boot
应用生命周期的管理 - stop:这个在
mvn integration-test
阶段,进行Spring Boot
应用生命周期的管理
这里功能,默认情况下使用就是 repackage 功能,其他功能要使用,则需要开发者显式配置。
打包
=============================================================
repackage 功能的 作用,就是在打包的时候,多做一点额外的事情:
- 首先
mvn package
命令 对项目进行打包,打成一个jar
,这个jar
就是一个普通的jar
,可以被其他项目依赖,但是不可以被执行 repackage
命令,对第一步 打包成的jar
进行再次打包,将之打成一个 可执行jar
,通过将第一步打成的jar
重命名为*.original
文件
举个例子:
对任意一个 Spring Boot 项目进行打包,可以执行 mvn package
命令,也可以直接在 IDEA
中点击 package
,如下 :
打包成功之后, target
中的文件如下:
这里有两个文件,第一个 restful-0.0.1-SNAPSHOT.jar
表示打包成的可执行 jar
,第二个 restful-0.0.1-SNAPSHOT.jar.original
则是在打包过程中 ,被重命名的 jar
,这是一个不可执行 jar
,但是可以被其他项目依赖的 jar
。通过对这两个文件的解压,我们可以看出这两者之间的差异。
两种 jar 的比较
=====================================================================
可执行 jar
解压之后,目录如下:
可以看到,可执行 jar 中,我们自己的代码是存在 于 BOOT-INF/classes/
目录下,另外,还有一个 META-INF
的目录,该目录下有一个 MANIFEST.MF
文件,打开该文件,内容如下:
Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: org.javaboy.restful.RestfulApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher
可以看到,这里定义了一个 Start-Class
,这就是可执行 jar
的入口类,Spring-Boot-Classes
表示我们自己代码编译后的位置,Spring-Boot-Lib
则表示项目依赖的 jar
的位置。
换句话说,如果自己要打一个可执行 jar
包的话,除了添加相关依赖之外,还需要配置 META-INF/MANIFEST.MF
文件。
这是可执行 jar 的结构,那么不可执行 jar 的结构呢?
我们首先将默认的后缀 .original
除去,然后给文件重命名,重命名完成,进行解压:
解压后可以看到,不可执行 jar
根目录就相当于我们的 classpath
,解压之后,直接就能看到我们的代码,它也有 META-INF/MANIFEST.MF
文件,但是文件中没有定义启动类等。
Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0