传统部署
Spring Boot支持传统部署以及更现代的部署形式。本节回答有关传统部署的常见问题。
创建可部署的war文件
产生一个可部署war包的第一步是提供一个SpringBootServletInitializer子类,并覆盖它的configure方法,这充分利用了Spring框架对Servlet 3.0的支持,并允许你在应用通过servlet容器启动时配置它。通常,你只需把应用的主类改为继承SpringBootServletInitializer即可:
下一步是更新你的构建配置,这样你的项目将产生一个war包而不是jar包。如果你使用Maven,并使用spring-boot-starter-parent(为了配置Maven的war插件),所有你需要做的就是更改pom.xml的打包方式为war:
如果你使用Gradle,你需要修改build.gradle来将war插件应用到项目上:
apply plugin: 'war'
该过程最后的一步是确保内嵌的servlet容器不能干扰war包将部署的servlet容器。为了达到这个目的,你需要将内嵌容器的依赖标记为provided。
如果使用Maven:
如果使用Gradle:
如果你使用Spring Boot构建工具,将内嵌容器依赖标记为provided将产生一个可执行war包,在lib-provided目录有该war包的provided依赖。这意味着,除了部署到servlet容器,你还可以通过使用命令行java -jar命令来运行应用。
注 查看Spring Boot基于以上配置的一个Maven示例应用。
为老的servlet容器创建可部署的war文件
老的Servlet容器不支持在Servlet 3.0中使用的ServletContextInitializer启动处理。你仍旧可以在这些容器使用Spring和Spring Boot,但你需要为应用添加一个web.xml,并将它配置为通过一个DispatcherServlet加载一个ApplicationContext。
将现有的应用转换为Spring Boot
对于一个非web项目,转换为Spring Boot应用很容易(抛弃创建ApplicationContext的代码,取而代之的是调用SpringApplication或SpringApplicationBuilder)。Spring MVC web应用通常先创建一个可部署的war应用,然后将它迁移为一个可执行的war或jar,建议阅读Getting Started Guide on Converting a jar to a war.。
通过继承SpringBootServletInitializer创建一个可执行war(比如,在一个名为Application的类中),然后添加Spring Boot的@EnableAutoConfiguration注解,示例:
记住不管你往sources放什么东西,它仅是一个Spring ApplicationContext,正常情况下,任何生效的在这里也会起作用。有一些beans你可以先移除,然后让Spring Boot提供它的默认实现,不过有可能需要先完成一些事情。
静态资源可以移到classpath根目录下的/public(或/static,/resources,/META-INF/resources)。同样的方式也适合于messages.properties(Spring Boot在classpath根目录下自动发现这些配置)。
美妙的(Vanilla usage of)Spring DispatcherServlet和Spring Security不需要改变。如果你的应用有其他特性,比如使用其他servlets或filters,那你可能需要添加一些配置到你的Application上下文中,按以下操作替换web.xml的那些元素:
- 在容器中安装一个Servlet或ServletRegistrationBean类型的@Bean,就好像web.xml中的<servlet/>和<servlet-mapping/>。
- 同样的添加一个Filter或FilterRegistrationBean类型的@Bean(类似于<filter/>和<filter-mapping/>)。
- 在XML文件中的ApplicationContext可以通过@Import添加到你的Application中。简单的情况下,大量使用注解配置可以在几行内定义@Bean定义。
一旦war可以使用,我们就通过添加一个main方法到Application来让它可以执行,比如:
应用可以划分为多个类别:
- 没有web.xml的Servlet 3.0+应用
- 有web.xml的应用
- 有上下文层次的应用
- 没有上下文层次的应用
所有这些都可以进行适当的转化,但每个可能需要稍微不同的技巧。
Servlet 3.0+的应用转化的相当简单,如果它们已经使用Spring Servlet 3.0+初始化器辅助类。通常所有来自一个存在的WebApplicationInitializer的代码可以移到一个SpringBootServletInitializer中。如果一个存在的应用有多个ApplicationContext(比如,如果它使用AbstractDispatcherServletInitializer),那你可以将所有上下文源放进一个单一的SpringApplication。你遇到的主要难题可能是如果那样不能工作,那你就要维护上下文层次。参考示例entry on building a hierarchy。一个存在的包含web相关特性的父上下文通常需要分解,这样所有的ServletContextAware组件都处于子上下文中。
对于还不是Spring应用的应用来说,上面的指南有助于你把应用转换为一个Spring Boot应用,但你也可以选择其他方式。
部署WAR到Weblogic
想要将Spring Boot应用部署到Weblogic,你需要确保你的servlet初始化器直接实现WebApplicationInitializer(即使你继承的基类已经实现了它)。
一个传统的Weblogic初始化器可能如下所示:
如果使用logback,你需要告诉Weblogic你倾向使用的打包版本而不是服务器预装的版本。你可以通过添加一个具有如下内容的WEB-INF/weblogic.xml实现该操作:
使用Jedis代替Lettuce
默认情况下,Spring Boot starter(spring-boot-starter-data-redis)使用 Lettuce。您需要排除该依赖关系,并包含Jedis。Spring Boot管理这些依赖关系,以便尽可能简化此过程。
以下示例显示了如何在Maven中执行此操作:
以下示例显示了如何在Gradle中执行此操作: