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 下方插入以下配置:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. </plugin>
  7. </plugins>
  8. </build>

注意

spring-boot-starter-parent POM 包含了 <executions> 配置,用于绑定 repackage 。如果您没有使用父 POM,您需要自己声明此配置。有关详细的信息,请参阅插件文档

保存 pom.xml 并在命令行中运行 mvn package

  1. $ mvn package
  2. [INFO] Scanning for projects...
  3. [INFO]
  4. [INFO] ------------------------------------------------------------------------
  5. [INFO] Building myproject 0.0.1-SNAPSHOT
  6. [INFO] ------------------------------------------------------------------------
  7. [INFO] .... ..
  8. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
  9. [INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
  10. [INFO]
  11. [INFO] --- spring-boot-maven-plugin:2.0.0.RELEASE:repackage (default) @ myproject ---
  12. [INFO] ------------------------------------------------------------------------
  13. [INFO] BUILD SUCCESS
  14. [INFO] ------------------------------------------------------------------------

如果您浏览 target 目录,您应该会看到 myproject-0.0.1-SNAPSHOT.jar。该文件的大小大约为 10 MB。如果您想要查看里面的内容,可以使用 jar tvf

  1. $ jar tvf target/myproject-0.0.1-SNAPSHOT.jar

您应该还会在 target 目录中看到一个名为 myproject-0.0.1-SNAPSHOT.jar.original 的较小文件。这是在 Spring Boot 重新打包之前由 Maven 所创建的原始 jar 文件。

使用 java -jar 命令运行该应用:

  1. $ java -jar target/myproject-0.0.1-SNAPSHOT.jar
  2. . ____ _ __ _ _
  3. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  4. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  5. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  6. ' |____| .__|_| |_|_| |_\__, | / / / /
  7. =========|_|==============|___/=/_/_/_/
  8. :: Spring Boot :: (v2.0.0.RELEASE)
  9. ....... . . .
  10. ....... . . . (log output here)
  11. ....... . . .
  12. ........ Started Example in 2.536 seconds (JVM running for 2.864)

跟之前一样, 要平滑退出应用,请按 ctrl-c