21.2.5 尝试运行

Contacts 应用非常简单,但是也算得上现实中的 Spring 应用。它具有 Spring MVC 控制器和 Thymeleaf 模板所定义的 Web 层,并且具有 Repository 和 Spring JdbcTemplate 所定义的持久层。

到此为止,我们已经编写完了 Contacts 所需的应用级别代码。不过,我们还没有编写任何形式的配置。我们没有编写任何 Spring 配置,也没有在 web.xml 或 Servlet 初始化类中配置 DispatcherServlet。

如果我说不需要编写任何的配置,你会相信吗?

这应该做不到吧,毕竟在对 Spring 的批评中,人们都在说 Spring 全是配置,肯定有我们忽略掉的 XML 文件或 Java 配置类。我们所编写的 Spring 应用程序根本就不可能没有任何配置的……那么,我们到底能做到吗?

通常来讲,Spring Boot 的自动配置特性消除了绝大部分或者全部的配置。因此,完全可能编写出没有任何配置的 Spring 应用程序。当然,自动配置并不能涵盖所有的场景,因此典型的 Spring Boot 应用程序依然会需要一点配置。

具体到 Contacts 应用,我们不需要任何的配置。Spring 的自动配置功能已经将所有的事情都做好了。

但是,我们需要有个特殊的类来启动 Spring Boot 应用。Spring 本身并不知道自动配置的任何信息。程序清单 21.7 中的 Application 类就是 Spring Boot 启动类的典型例子。

程序清单 21.7 初始化 Spring Boot 配置的简单启动类

package contacts;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {
  public static void main(String[] args) {
    SpringApplication.run (Application, class, args);
  }
}

好吧,我承认 Application 中有那么一点配置。它使用 @ComponentScan 注解来启用组件扫描,另外它还使用了 @EnableAutoConfiguration,这会启用 Spring Boot 的自动配置特性。但是,也就这么多了!除了这两行代码以外,Contacts 再也没有什么配置了。

Application 类最有意思的一点在于它具有一个 main() 方法。稍后将会看到,Spring Boot 应用会以一种特殊的方法运行,正是这里的 main() 方法使这一切成为可能。在 main() 方法中,这行代码会告诉 Spring Boot(通过 SpringApplication 类)根据 Application 中的配置以及命令行中的参数来运行。

现在,我们马上就可以运行应用了。剩下就是要进行构建。如果使用 Gradle 的话,那么如下的命令行会将项目构建到 “build/libs/contacts-0.1.0.jar” 中:

$ gradle build

如果你喜欢 Maven 的话,那么可以按照如下的方式构建项目:

$ mvn package

运行 Maven 构建后,你会在 target 文件夹下找到构建形成的结果。

现在,我们就可以运行它了。按照传统的方式,这意味着要将应用的 WAR 文件部署到 Servlet 容器中,如 Tomcat 或 WebSphere。但是在这里,我们甚至没有 WAR 文件 —— 构建形成的是一个 JAR 文件。

这没有什么问题。我们可以按照如下的方式从命令行运行它(引用的是基于 Gradle 构建的 JAR 文件):

$ java -jar build/libs/contacts-0.1.0.jar

在几秒钟后,应用应该已经启动完成并且可以访问了。打开浏览器进入 http://localhost:8080,你就应该可以输入联系人了。在输入几个联系人后,浏览器将会如图 21.1 所示。

你可能觉得这并不符合 Web 应用的运行方式。像这样从命令行运行应用非常简洁和方便,但是,对于你来讲,也许这并不理想。在你所工作的环境中,有可能需要将 Web 应用作为 WAR 文件部署到 Web 容器中。如果不提交 WAR 文件的话,可能不满足公司的部署策略。

好的,那也没有问题。

即便是对于生产环境,通过命令行来运行应用也是合理的方案,但是我理解你可能需要遵循公司的部署流程。这意味着需要构建和部署 WAR 文件。

好消息是,如果你需要 WAR 文件的话,并没有必要舍弃 Spring Boot 的简洁性。需要做的事情仅仅是稍微调整一下构建文件。在 Gradle 构建中,我们需要添加如下这行代码来应用 “war” 插件:

apply plugin "war"

除此之外,还需要将 “jar” 配置调整为 “war”。这实际上就是将 “j” 替换为 “w”:

war {
  baseName = "contacts"
  version = "0.1.0"
}

如果是 Maven 构建的项目,那会更加简单。只需将 packaging 从 “jar” 替换为 “war” 即可:

<packaging>war</packaging>

现在,我们可以重新构建项目,然后将会在构建目录中找到 contacts-0.1.0.war 文件。这个 WAR 文件文件可以部署到任意支持 Servlet 3.0 的容器中。另外,我们依然可以在命令行中运行这个应用:

$ java -jar build/libs/contacts-0.1.0.war

没错:这是一个可运行的 WAR 文件!对于两种场景来说,这都是最佳的方案。

我们可以看到,Spring Boot 能够在很大程度上尽可能简化 Spring 应用的部署。Spring Boot Stater 简化了项目构建的依赖,自动配置消除了显式的 Spring 配置。但稍后你会看到,如果再结合 Groovy,它会更加简单。

Last updated