2.1 将web应用打包为jar

2016-02-19 21:22:58 11,700 1


通常情况下,对于一个 web应用,例如我们之前使用到的 hello应用,在部署的时候,我们会将其打包成一个 war包,然后部署到tomcat下面。
在使用了 SpringBoot之后,我们可以将应用打包为一个可以运行的 jar包,同样可以运行这个应用,因为 tomcat已经内嵌在我们的程序中了,因此我们并不需要将 hello应用打成war 包,然后再部署。

通常我们将一个可以运行的 jar包称之为fat jar 。因为这样的 jar包内部通常包含了自己运行时的所有依赖,也就是一个大的 jar中内部包含了自己运行时所有依赖的 jar(jar包中还有jar 包),体积比较大,所以比较 fat。

要注意的是, Java并没有提供一种标准的方式来加载“嵌套 jar”。而SpringBoot 提供了一个插件,可以帮助我们将应用打包成一个可以运行的 jar。

以 quick start案例为例,在pom.xml文件中加入:

<build>
        <!-- 将应用打包成一个可以运行的 jar -->
        <plugins>
            <plugin>
               <groupId> org.springframework.boot </groupId>
               <artifactId> spring-boot-maven-plugin </artifactId>
            </plugin>
        </plugins>
     </build>

这段配置可以帮助我们将SpringBoot应用打包成一个可运行的jar。
下面开始执行打包的操作,右击项目名 "run as =>maven build" ,在goals 中输入package:

Image.png

点击 run之后,我们可以target目录下看到类似以下的文件

Image.png

其中, springbootstudy-0.0.1-SNAPSHOT.jar是我们打包好的,内部包含了其他依赖的,可以直接运行的jar,而springbootstudy-0.0.1-SNAPSHOT.jar.original 则是原始的打包后的jar。

进入 target文件夹所在目录,我们可以看看这两个文件的区别:

Image.png

第一个可以直接运行的 jar的大小为13M 左右,而第二个只有 6KB。

通过jar tvf springbootstudy-0.0.1-SNAPSHOT.jar 命令,我们可以看到这个 jar中的内容,当然更直观的方式,你可以选择直接右击解压这个 jar文件,就会发现这个 jar的 lib目录下,实际上存放了所有依赖的 jar。而 springbootstudy-0.0.1-SNAPSHOT.jar.original 则是没有包含这些依赖的 jar的原始包。

我们可以通过命令 java -jar springbootstudy-0.0.1-SNAPSHOT.jar来直接运行这个jar,你将会在命令行看到和在Eclipse中直接运行quick start应用同样的输出内容,在浏览器中输入 localhost:8080,可以看到同样的效果。

Image.png

注意:,如果你的项目不是没有设置 parent项目为 spring-boot-starter-parent,那么spring-boot-maven-plugin的配置就要显示的指定执行阶段,如下所示

<plugin>
                <groupId> org.springframework.boot </groupId>
                <artifactId> spring-boot-maven-plugin </artifactId>
                <!--如果父项目不是spring-boot-starter-parent,需要显示指定execution-->
                <executions>
                    <execution>
                        <goals>
                            <goal> repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>