11.5、创建可执行 jar
我们通过创建一个完全自包含(self-contained)的可执行 jar 文件完成了示例。该 jar 文件可以在生产环境中运行。可执行 jar(有时又称为 fat jars
)是包含了编译后的类以及代码运行时所需要相关的 jar 依赖的归档文件。
可执行 jar 与 Java
Java 不提供任何标准方式来加载嵌套的 jar 文件(比如本身包含在 jar 中的 jar 文件)。如果您想分发自包含的应用,这可能是个问题。
为了解决此问题,许多开发人员使用了 uber jar,uber jar 从所有应用的依赖中打包所有的类到一个归档中。这种方法的问题在于,您很难看出应用程序实际上使用到了哪些库。如果在多个 jar 中使用了相同的文件名(但内容不同),这也可能产生问题。
Spring Boot 采用了不同方方式,可以直接对 jar 进行嵌套。
要创建可执行 jar,我们需要将 spring-boot-maven-plugin
添加到 pom.xml
文件中。在 dependencies
下方插入以下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注意
spring-boot-starter-parent
POM 包含了<executions>
配置,用于绑定repackage
。如果您没有使用父 POM,您需要自己声明此配置。有关详细的信息,请参阅插件文档。
保存 pom.xml
并在命令行中运行 mvn package
:
$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.0.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
如果您浏览 target
目录,您应该会看到 myproject-0.0.1-SNAPSHOT.jar
。该文件的大小大约为 10 MB。如果您想要查看里面的内容,可以使用 jar tvf
:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
您应该还会在 target
目录中看到一个名为 myproject-0.0.1-SNAPSHOT.jar.original
的较小文件。这是在 Spring Boot 重新打包之前由 Maven 所创建的原始 jar 文件。
使用 java -jar
命令运行该应用:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.0.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
跟之前一样, 要平滑退出应用,请按 ctrl-c
。