传统部署

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

创建可部署的战争文件

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

制作可部署战争文件的第一步是提供SpringBootServletInitializer子类并覆盖其配置方法。 这样做利用了 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)
}

下一步是更新你的构建配置,使项目生成战争文件而不是jar文件。 如果你用Maven和Spring靴启动父(它帮你配置了Maven的战争插件),你只需要修改一下pom.xml将包装改为战争,具体如下:spring-doc.cadn.net.cn

<packaging>war</packaging>

如果你用Gradle,你需要修改build.gradle为项目应用War插件,具体如下:spring-doc.cadn.net.cn

apply plugin: 'war'

流程的最后一步是确保嵌入的servlet容器不会干扰部署战争文件的servlet容器。spring-doc.cadn.net.cn

对于 Maven,你需要将嵌入的 servlet 容器依赖标记为提供. 例如: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更受青睐仅编译配置。 除其他限制外,仅编译依赖不依赖于测试类路径,因此任何基于网页的集成测试都会失败。

如果你使用 Spring Boot 构建工具插件,标记嵌入的 servlet 容器依赖为提供的,会生成一个可执行的 war 文件,包含所提供的依赖,打包在lib-提供的目录。 这意味着,除了可以部署到 servlet 容器外,你还可以通过以下方式运行你的应用程序Java -jar在命令行。spring-doc.cadn.net.cn

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

要将现有的非网页 Spring 应用转换为 Spring Boot 应用,替换创建应用上下文并用调用替换为SpringApplicationSpringApplicationBuilder. Spring MVC Web应用通常支持先创建可部署的战争应用,然后再迁移到可执行的战争或jar。spring-doc.cadn.net.cn

通过延长战力创造可部署的战争SpringBootServletInitializer(例如,在一个名为应用并加装了Spring靴@SpringBootApplication注释,使用类似以下示例所示的代码: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
	}

}

记住,无论你放进去什么来源只是一个泉水应用上下文. 通常,任何已经能用的设备在这里都能正常工作。 可能之后可以移除一些豆子,让 Spring Boot 为它们提供默认设置,但应该能在你做之前先让它正常工作。spring-doc.cadn.net.cn

静态资源可以迁移到/公共(或/静态的/资源/元补强/资源)在类路径根中。 同样适用于messages.properties(Spring Boot 会自动在类路径根中检测到该系统)。spring-doc.cadn.net.cn

Spring的原版使用调度器服务而Spring Security则无需进一步更改。 如果你的应用中有其他功能(例如使用其他servlet或过滤器),你可能需要在你的应用中添加一些配置应用上下文,通过替换这些元素web.xml如下:spring-doc.cadn.net.cn

一旦战争文件正常工作,你可以通过添加一个主要方法以实现您的应用如下例所示:spring-doc.cadn.net.cn

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

如果你打算以战争应用或可执行应用的形式启动你的应用,你需要以一种既可访问的方式共享构建者的自定义内容SpringBootServletInitializer回调和在主要类似于以下类的方法: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. 如果你现有的应用有多个应用上下文(例如,如果它使用AbstractDispatcherServletInitializer然后你可能能把所有上下文源合并成一个SpringApplication. 你可能遇到的主要问题是组合不行,需要保持上下文层级结构。 关于构建层级的条目示例。 包含网页特定功能的现有父上下文通常需要拆分,以便所有ServletContextAware组件位于子上下文中。spring-doc.cadn.net.cn

尚未是 Spring 应用的应用程序可能可以转换为 Spring Boot 应用,前面提到的指导可能会有所帮助。 不过,你仍可能遇到问题。 在这种情况下,我们建议在 Stack Overflow 上提问时,标签为Spring靴.spring-doc.cadn.net.cn

向WebLogic部署WAR

要将 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 优先选择打包版本,而不是服务器预装版本。 你可以通过添加一个网络-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>