此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

传统部署

Spring Boot 支持传统部署方式以及更现代的部署形式。 本节解答有关传统部署的常见问题。spring-doc.cadn.net.cn

创建可部署的 War 文件

由于 Spring WebFlux 并不严格依赖于 Servlet API,并且应用程序默认部署在内嵌的 Reactor Netty 服务器上,因此 WebFlux 应用程序不支持 War 部署。

生成可部署的 war 文件的第一步是提供一个 SpringBootServletInitializer 子类并重写其 configure 方法。 这样做可以利用 Spring Framework 的 Servlet 3.0 支持,并允许您在应用程序由 Servlet 容器启动时进行配置。 通常,您应该更新应用程序的主类以扩展 SpringBootServletInitializer,如下例所示:spring-doc.cadn.net.cn

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(MyApplication.class);
	}

	public static void main(String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}

}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.boot.runApplication
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer

@SpringBootApplication
class MyApplication : SpringBootServletInitializer() {

	override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder {
		return application.sources(MyApplication::class.java)
	}

}

fun main(args: Array<String>) {
	runApplication<MyApplication>(*args)
}

下一步是更新你的构建配置,使你的项目生成一个 WAR 文件而不是 JAR 文件。 如果你使用 Maven 和 spring-boot-starter-parent(它会为你配置好 Maven 的 WAR 插件),你只需修改 pom.xml 文件,将打包方式改为 war,如下所示:spring-doc.cadn.net.cn

<packaging>war</packaging>

如果你使用 Gradle,则需要修改 build.gradle 文件,将 war 插件应用到项目中,如下所示:spring-doc.cadn.net.cn

apply plugin: 'war'

该过程的最后一步是确保内嵌的 Servlet 容器不会干扰部署 WAR 文件的目标 Servlet 容器。spring-doc.cadn.net.cn

对于 Maven,你需要将嵌入式 Servlet 容器依赖标记为 provided。 例如:spring-doc.cadn.net.cn

<dependencies>
	<!-- ... -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<scope>provided</scope>
	</dependency>
	<!-- ... -->
</dependencies>

如果你使用 Gradle,则只需将运行时依赖项移至 providedRuntime 配置中。 例如:spring-doc.cadn.net.cn

dependencies {
	// ...
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat-runtime'
	// ...
}
providedRuntime 优于 Gradle 的 compileOnly 配置。 除了其他限制之外,compileOnly 依赖项不会包含在测试类路径中,因此任何基于 Web 的集成测试都会失败。

如果你使用 Spring Boot 的构建工具插件,将嵌入式 Servlet 容器依赖标记为 provided,将会生成一个可执行的 WAR 文件,其中 provided 依赖会被打包到 lib-provided 目录中。 这意味着,除了可以部署到 Servlet 容器之外,你还可以通过命令行使用 java -jar 来运行你的应用程序。spring-doc.cadn.net.cn

将现有应用程序转换为 Spring Boot

要将现有的非 Web Spring 应用程序转换为 Spring Boot 应用程序,请替换创建 ApplicationContext 的代码,并将其替换为对 SpringApplicationSpringApplicationBuilder 的调用。 Spring MVC Web 应用程序通常适合先创建一个可部署的 war 应用程序,然后再将其迁移到可执行的 war 或 jar。spring-doc.cadn.net.cn

要通过扩展 SpringBootServletInitializer(例如,在一个名为 Application 的类中)并添加 Spring Boot 的 @SpringBootApplication 注解来创建可部署的 WAR 文件,请使用类似于以下示例的代码:spring-doc.cadn.net.cn

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		// Customize the application or call application.sources(...) to add sources
		// Since our example is itself a @Configuration class (through
		// @SpringBootApplication)
		// we actually do not need to override this method.
		return application;
	}


}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.boot.runApplication
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer

@SpringBootApplication
class MyApplication : SpringBootServletInitializer() {

	override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder {
		// Customize the application or call application.sources(...) to add sources
		// Since our example is itself a @Configuration class (through @SpringBootApplication)
		// we actually do not need to override this method.
		return application
	}

}

请记住,无论您在 sources 中放置什么,它都仅仅是一个 Spring ApplicationContext。 通常,任何已经能够正常工作的内容在这里也应该能正常工作。 可能会有一些 Bean 您可以在稍后移除,并让 Spring Boot 为其提供自己的默认值,但在您需要这样做之前,应该可以先让某些功能运行起来。spring-doc.cadn.net.cn

静态资源可以移至类路径根目录下的 /public(或 /static/resources/META-INF/resources)目录中。 这一点同样适用于 messages.properties 文件(Spring Boot 会自动在类路径根目录下检测该文件)。spring-doc.cadn.net.cn

Spring 的常规用法 DispatcherServlet 以及 Spring Security 应该不需要进一步的更改。 如果您的应用程序中包含其他功能(例如,使用了其他 Servlet 或过滤器),则可能需要在您的 Application 上下文中添加一些配置,方法是从 web.xml 中替换这些元素,如下所示:spring-doc.cadn.net.cn

一旦 WAR 文件可以正常运行,您可以通过在 main 类中添加一个 Application 方法使其可执行,如下例所示:spring-doc.cadn.net.cn

	public static void main(String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}
fun main(args: Array<String>) {
	runApplication<MyApplication>(*args)
}

如果您打算将应用程序作为 war 包或可执行应用程序启动,则需要在一种方法中共享构建器的自定义配置,该方法既可供 SpringBootServletInitializer 回调使用,也可在类似于以下类的 main 方法中使用:spring-doc.cadn.net.cn

import org.springframework.boot.Banner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return customizerBuilder(builder);
	}

	public static void main(String[] args) {
		customizerBuilder(new SpringApplicationBuilder()).run(args);
	}

	private static SpringApplicationBuilder customizerBuilder(SpringApplicationBuilder builder) {
		return builder.sources(MyApplication.class).bannerMode(Banner.Mode.OFF);
	}

}
import org.springframework.boot.Banner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer

@SpringBootApplication
class MyApplication : SpringBootServletInitializer() {

	override fun configure(builder: SpringApplicationBuilder): SpringApplicationBuilder {
		return customizerBuilder(builder)
	}

	companion object {

		@JvmStatic
		fun main(args: Array<String>) {
			customizerBuilder(SpringApplicationBuilder()).run(*args)
		}

		private fun customizerBuilder(builder: SpringApplicationBuilder): SpringApplicationBuilder {
			return builder.sources(MyApplication::class.java).bannerMode(Banner.Mode.OFF)
		}

	}

}

应用程序可以属于多个类别:spring-doc.cadn.net.cn

所有这些都应该可以进行翻译,但每种情况可能需要略微不同的技术。spring-doc.cadn.net.cn

如果 Servlet 3.0+ 应用程序已经使用了 Spring Servlet 3.0+ 初始化器支持类,那么它们可能很容易进行迁移。 通常,现有 WebApplicationInitializer 中的所有代码都可以移入到 SpringBootServletInitializer 中。 如果您的现有应用程序包含多个 ApplicationContext(例如,如果它使用了 AbstractDispatcherServletInitializer),那么您也许可以将所有上下文源合并到一个单独的 SpringApplication 中。 您可能遇到的主要复杂情况是,如果合并不起作用,则需要维护上下文层次结构。 请参阅关于构建层次结构的条目以获取示例。 现有的包含 Web 特定功能的父上下文通常需要拆分,以便所有 ServletContextAware 组件都位于子上下文中。spring-doc.cadn.net.cn

尚未成为 Spring 应用程序的应用可能可以转换为 Spring Boot 应用程序,前述指南或许能有所帮助。 然而,您仍可能会遇到问题。 在这种情况下,我们建议在 Stack Overflow 上使用spring-boot标签提问spring-doc.cadn.net.cn

将 WAR 部署到 WebLogic

要将 Spring Boot 应用程序部署到 WebLogic,您必须确保您的 Servlet 初始化器直接实现WebApplicationInitializer(即使您扩展的基类已经实现了它)。spring-doc.cadn.net.cn

WebLogic 的典型初始化程序应类似于以下示例:spring-doc.cadn.net.cn

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.WebApplicationInitializer;

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer {

}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
import org.springframework.web.WebApplicationInitializer

@SpringBootApplication
class MyApplication : SpringBootServletInitializer(), WebApplicationInitializer

如果你使用 Logback,还需要告诉 WebLogic 优先使用应用程序中打包的版本,而不是服务器预装的版本。 你可以通过添加一个 WEB-INF/weblogic.xml 文件并包含以下内容来实现:spring-doc.cadn.net.cn

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
	xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		https://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
		http://xmlns.oracle.com/weblogic/weblogic-web-app
		https://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
	<wls:container-descriptor>
		<wls:prefer-application-packages>
			<wls:package-name>org.slf4j</wls:package-name>
		</wls:prefer-application-packages>
	</wls:container-descriptor>
</wls:weblogic-web-app>