让我们通过创建一个能够运行在生产环境中、完全独立且可执行的jar文件来完成我们的示例。可执行jar(有时称为“fat jar”)是包含有被编译的类以及代码运行所依赖的所有jar的归档文件。
可执行的jar和Java
Java没有提供任何标准的方法来加载嵌套的jar文件(即包含在一个jar文件中的jar文件)。如果您想发布一个独立的应用程序,这可能会导致问题。
为了解决这个问题,许多开发者使用“超级”jar。超级jar将所有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:1.5.7.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
如果查看target
目录,您应该看到myproject-0.0.1-SNAPSHOT.jar
文件。该文件的大小应该在10MB左右。如果您想查看文件内部,可以使用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 :: (v1.5.7.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
和前面一样,按ctrl-c
退出程序。