打包Boot应用
正如前面所讨论的,Boot提供了Maven和Gradle插件,它为构建系统的打包阶段提供了一种钩子(hook),以产生所谓的“胖jar”,在这种jar中包含了工程的所有依赖。当这个胖jar包执行时,应用将会运行在与工程开发期相同的嵌入式容器之中。这种简便的方式能够让开发人员省去很多麻烦,因为他们的部署包在开发期和运行时环境之中具有相同的依赖结构。这也能够缓解运维团队的焦虑,他们不用担心部署的场景,因为在部署时一个错误配置的运行时容器可能会带有某个特定的依赖,而在项目的开发期所依赖的可能是另外一个。
为了在Maven下执行打包,只需执行mvnpackage命令。Spring Boot的插件会备份工程所创建的原始jar并且在文件名上添加“.original”。在这里,能够得到可运行的jar,文件符合Maven artifact的命名约定,它可以按照工程最合适的方式进行部署。使用Gradle构建Boot工程同样很简单,只需执行标准的gradle build命令即可。类似于Maven,Boot插件在原有的打包任务之后使用Gradle安装了一个生命周期事件,并且会在build/libs目录下创建胖jar包。对所生成的胖jar包进行检查的一种方式就是所有依赖的jar都会位于归档文件的lib/目录下。
打包完成之后,胖jar包就能够像其他可运行的jar文件那样在命令行中执行了,也就是使用$JAVA_HOME/bin/java -jarpath/to/myproject.jar命令。启动后,Boot应用的日志将会显示在控制台上。
对于需要部署到传统servlet容器之中的应用,Boot提供了一种方式以编码的方式初始化Web配置。为了使用这一点,Boot提供了可选的WebApplicationInitializer,它会使用servlet容器来注册应用,这会通过Servlet 3.0 API以编码的方式注册servlet并且会用到ServletContext。通过提供SpringBootServletInitializer的子类,Boot应用能够使用嵌入的Spring上下文来注册配置,这个Spring上下文是在容器初始化的时候创建的。为了阐述这个功能,考虑程序清单1.27中的示例代码。
程序清单1.27
@RestController
@EnableAutoConfiguration
class Application extends SpringBootServletInitializer {
@RequestMapping(method = RequestMethod.GET)
String get() {
"home"
}
static voidmain(String[] args) {
SpringApplication.run this, args
}
@Override
SpringApplicationBuilder configure(SpringApplicationBuilder application){
application.sources Application
}
}
Application类中被重写的configure方法就是使用嵌入式的Spring上下文注册应用的地方。在更为正式的场景之中,这个方法可能会用来注册Spring Java配置类,它会定义应用中所有controller和服务的bean。
当将应用打包部署到servlet容器之中时,工程要构建为一个war文件。在Maven工程中,为了适应这一点,需要移除Boot插件,并且packaging需要明确定义为“war”类型,如程序清单1.28所示。
程序清单1.28
<?xml version="1.0"encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.0.0.RC1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
</project>
对这个工程执行mvn install命令会在target目录下生成myproject-1.0.0-SNAPSHOT.war文件。使用Gradle构建的工程可以使用Gradle War Plugin,它为构建war文件暴露了一个war任务。类似于Maven的配置,Boot Gradle工程也需要移除所包含的Boot插件。产生war文件的示例Gradle构建脚本如程序清单1.29所示。
程序清单1.29
apply plugin: 'java'
apply plugin: 'war'
repositories {
mavenCentral()
maven { url"http://repo.spring.io/snapshot" }
maven { url"http://repo.spring.io/milestone" }
}
ext {
springBootVersion= '1.0.0.BUILD-SNAPSHOT'
}
dependencies {
compile"org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
compile"org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}"
}
对于Boot工程,使用这个构建脚本运行Gradle的war任务将会在build/libs目录下产生war文件。
不管是Maven还是Gradle的配置,一旦war文件产生,它就可以部署到任意兼容Servlet 3.0的应用服务器之中。部分兼容的容器包括Tomcat 7+、Jetty 8、Glassfish 3.x、JBoss AS 6.x/7.x以及Websphere 8.0。