11.5 创建可执行的jar文件

让我们通过创建一个能够运行在生产环境中、完全独立且可执行的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退出程序。


书籍推荐