此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4spring-doc.cn

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

创建可部署的 war 文件

因为 Spring WebFlux 并不严格依赖于 servlet API,而且应用程序默认部署在嵌入式 Reactor Netty 服务器上,所以 WebFlux 应用程序不支持 War 部署。

生成可部署的 war 文件的第一步是提供一个子类并覆盖其方法。 这样做利用了 Spring Framework 的 servlet 3.0 支持,并允许您在 servlet 容器启动应用程序时对其进行配置。 通常,您应该更新应用程序的 main 类以扩展 ,如以下示例所示:SpringBootServletInitializerconfigureSpringBootServletInitializerspring-doc.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 和(为你配置 Maven 的 war 插件),你需要做的就是修改以将打包更改为 war,如下所示:spring-boot-starter-parentpom.xmlspring-doc.cn

<packaging>war</packaging>

如果使用 Gradle,则需要修改才能将 war 插件应用到项目中,如下所示:build.gradlespring-doc.cn

apply plugin: 'war'

该过程的最后一步是确保嵌入式 servlet 容器不会干扰 war 文件部署到的 servlet 容器。 为此,您需要将嵌入式 servlet 容器依赖项标记为已提供。spring-doc.cn

如果使用 Maven,以下示例将 Servlet 容器(在本例中为 Tomcat)标记为已提供:spring-doc.cn

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

如果使用 Gradle,以下示例将 servlet 容器(在本例中为 Tomcat)标记为已提供:spring-doc.cn

dependencies {
	// ...
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	// ...
}
providedRuntime优先于 Gradle 的配置。 除其他限制外,依赖项不在测试 Classpath 上,因此任何基于 Web 的集成测试都会失败。compileOnlycompileOnly

如果使用 Spring Boot Build Tool Plugins,则将嵌入式 servlet 容器依赖项标记为已提供将生成一个可执行的 war 文件,其中提供的依赖项打包在一个目录中。 这意味着,除了可部署到 servlet 容器之外,您还可以在命令行上使用 来运行应用程序。lib-providedjava -jarspring-doc.cn

因为 Spring WebFlux 并不严格依赖于 servlet API,而且应用程序默认部署在嵌入式 Reactor Netty 服务器上,所以 WebFlux 应用程序不支持 War 部署。
providedRuntime优先于 Gradle 的配置。 除其他限制外,依赖项不在测试 Classpath 上,因此任何基于 Web 的集成测试都会失败。compileOnlycompileOnly

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

要将现有的非 Web Spring 应用程序转换为 Spring Boot 应用程序,请替换创建 your 的代码,并将其替换为对 或 的调用。 Spring MVC Web 应用程序通常适合先创建一个可部署的 war 应用程序,然后再将其迁移到可执行的 war 或 jar 中。 请参阅有关将 jar 转换为 war 的入门指南ApplicationContextSpringApplicationSpringApplicationBuilderspring-doc.cn

要通过扩展(例如,在名为 的类中)并添加 Spring Boot 注释来创建可部署的 war,请使用类似于以下示例中所示的代码:SpringBootServletInitializerApplication@SpringBootApplicationspring-doc.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
	}

}

请记住,无论你放入什么 都只是一个 弹簧 . 通常,任何已经有效的内容都应该在这里工作。 可能有一些 bean 你可以稍后删除,并让 Spring Boot 为它们提供自己的默认值,但是在你需要这样做之前,应该可以让一些东西工作。sourcesApplicationContextspring-doc.cn

静态资源可以移动到 Classpath 根目录中(或 or 或 )。 这同样适用于(Spring Boot 在 Classpath 的根目录中自动检测到)。/public/static/resources/META-INF/resourcesmessages.propertiesspring-doc.cn

Spring 和 Spring Security 的原版用法应该不需要进一步的更改。 如果您的应用程序中还有其他功能(例如,使用其他 servlet 或过滤器),则可能需要通过替换 中的这些元素来向上下文添加一些配置,如下所示:DispatcherServletApplicationweb.xmlspring-doc.cn

  • A 类型的 or 将该 Bean 安装在容器中,就像它是 a 和 一样。@BeanServletServletRegistrationBean<servlet/><servlet-mapping/>web.xmlspring-doc.cn

  • 类型 或 行为相似的 A (如 a 和 )。@BeanFilterFilterRegistrationBean<filter/><filter-mapping/>spring-doc.cn

  • 可以通过 中的 . 或者,可以在几行中重新创建已大量使用 Comments 配置的情况作为定义。ApplicationContext@ImportResourceApplication@Beanspring-doc.cn

一旦 war 文件开始工作,你可以通过向 中添加一个方法来使其可执行,如以下示例所示:mainApplicationspring-doc.cn

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

如果您打算将应用程序作为 war 或可执行应用程序启动,则需要在回调可用的方法中共享构建器的自定义,并在类似于以下内容的类中共享该方法:SpringBootServletInitializermainspring-doc.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.cn

所有这些都应该适合翻译,但每个可能需要略有不同的技术。spring-doc.cn

如果 Servlet 3.0+ 应用程序已经使用 Spring Servlet 3.0+ 初始化器支持类,那么它们可能很容易进行翻译。 通常,现有代码中的所有代码都可以移动到 . 如果您现有的应用程序有多个(例如,如果它使用 ),则您或许能够将所有上下文源合并到一个 . 您可能会遇到的主要复杂情况是,如果合并不起作用,并且您需要维护上下文层次结构。 有关示例,请参阅 building a hierarchy 上的条目。 通常需要分解包含 Web 特定功能的现有父上下文,以便所有组件都位于子上下文中。WebApplicationInitializerSpringBootServletInitializerApplicationContextAbstractDispatcherServletInitializerSpringApplicationServletContextAwarespring-doc.cn

尚不是 Spring 应用程序的应用程序可能可转换为 Spring Boot 应用程序,前面提到的指南可能会有所帮助。 但是,您可能还会遇到问题。 在这种情况下,我们建议在 Stack Overflow 上使用 spring-boot 标签提问spring-doc.cn

如果您打算将应用程序作为 war 或可执行应用程序启动,则需要在回调可用的方法中共享构建器的自定义,并在类似于以下内容的类中共享该方法:SpringBootServletInitializermainspring-doc.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)
		}

	}

}

将 WAR 部署到 WebLogic

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

WebLogic 的典型初始值设定项应类似于以下示例:spring-doc.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.xmlspring-doc.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>