此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
Spring Boot 支持传统部署以及更现代的部署形式。 本节回答有关传统部署的常见问题。
创建可部署的战争文件
由于 Spring WebFlux 并不严格依赖于 servlet API,并且应用程序默认部署在嵌入式 Reactor Netty 服务器上,因此 WebFlux 应用程序不支持 War 部署。 |
生成可部署的 war 文件的第一步是提供子类并重写其方法。
这样做会利用 Spring Framework 的 servlet 3.0 支持,并允许您在 servlet 容器启动应用程序时对其进行配置。
通常,应将应用程序的主类更新为 extend ,如以下示例所示:SpringBootServletInitializer
configure
SpringBootServletInitializer
-
Java
-
Kotlin
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-parent
pom.xml
<packaging>war</packaging>
如果使用 Gradle,需要修改才能将 war 插件应用到项目中,如下所示:build.gradle
apply plugin: 'war'
该过程的最后一步是确保嵌入的 servlet 容器不会干扰 war 文件部署到的 servlet 容器。 为此,您需要将嵌入的 servlet 容器依赖项标记为已提供。
如果使用 Maven,则以下示例将 servlet 容器(在本例中为 Tomcat)标记为已提供:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- ... -->
</dependencies>
如果您使用 Gradle,以下示例将 servlet 容器(在本例中为 Tomcat)标记为已提供:
dependencies {
// ...
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
// ...
}
providedRuntime 优先于 Gradle 的配置。
除其他限制外,依赖项不在测试类路径上,因此任何基于 Web 的集成测试都会失败。compileOnly compileOnly |
如果使用 Spring Boot 构建工具,则将嵌入式 servlet 容器依赖项标记为已提供,将生成一个可执行的 war 文件,其中包含打包在目录中的提供的依赖项。
这意味着,除了可部署到 servlet 容器之外,您还可以在命令行上运行应用程序。lib-provided
java -jar
由于 Spring WebFlux 并不严格依赖于 servlet API,并且应用程序默认部署在嵌入式 Reactor Netty 服务器上,因此 WebFlux 应用程序不支持 War 部署。 |
providedRuntime 优先于 Gradle 的配置。
除其他限制外,依赖项不在测试类路径上,因此任何基于 Web 的集成测试都会失败。compileOnly compileOnly |
将现有应用程序转换为 Spring Boot
要将现有的非 Web Spring 应用程序转换为 Spring Boot 应用程序,请替换创建 的代码,并将其替换为对 或 的调用。
Spring MVC Web 应用程序通常适合首先创建可部署的 war 应用程序,然后再将其迁移到可执行的 war 或 jar 中。
请参阅有关将罐子转换为战争的入门指南。ApplicationContext
SpringApplication
SpringApplicationBuilder
要通过扩展(例如,在名为 的类中)并添加 Spring Boot 注解来创建可部署的战争,请使用类似于以下示例中所示的代码:SpringBootServletInitializer
Application
@SpringBootApplication
-
Java
-
Kotlin
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 为它们提供自己的默认值,但在您需要这样做之前,应该可以让某些东西正常工作。sources
ApplicationContext
静态资源可以移动到类路径根目录中的(或)。
这同样适用于(Spring Boot 在类路径的根目录中自动检测到)。/public
/static
/resources
/META-INF/resources
messages.properties
Spring 和 Spring Security 的原版用法不应需要进一步更改。
如果应用程序中有其他功能(例如,使用其他 servlet 或过滤器),则可能需要通过替换 中的这些元素来向上下文添加一些配置,如下所示:DispatcherServlet
Application
web.xml
-
类型 或 将该 Bean 安装在容器中,就好像它是 a 和 in 一样。
@Bean
Servlet
ServletRegistrationBean
<servlet/>
<servlet-mapping/>
web.xml
-
类型或行为类似(如 a 和 )。
@Bean
Filter
FilterRegistrationBean
<filter/>
<filter-mapping/>
-
XML 文件中的 an 可以通过 in 中的 . 或者,已经大量使用注释配置的情况可以在几行中重新创建为定义。
ApplicationContext
@ImportResource
Application
@Bean
一旦 war 文件正常工作,您可以通过向 添加方法使其可执行,如以下示例所示:main
Application
-
Java
-
Kotlin
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
如果打算将应用程序作为 war 或可执行应用程序启动,则需要在可供回调使用的方法和类似于以下内容的类中共享生成器的自定义项:
|
应用程序可以分为多个类别:
-
Servlet 3.0+ 应用程序没有 .
web.xml
-
带有 .
web.xml
-
具有上下文层次结构的应用程序。
-
没有上下文层次结构的应用程序。
所有这些都应该适合翻译,但每个可能需要略有不同的技术。
如果 Servlet 3.0+ 应用程序已经使用 Spring Servlet 3.0+ 初始值设定项支持类,则它们可能很容易转换。
通常,现有代码中的所有代码都可以移动到 .
如果现有应用程序有多个(例如,如果它使用 ),则可以将所有上下文源合并到一个 .
您可能遇到的主要复杂情况是,如果合并不起作用,并且您需要维护上下文层次结构。
有关示例,请参阅有关构建层次结构的条目。
通常需要分解包含特定于 Web 的功能的现有父上下文,以便所有组件都位于子上下文中。WebApplicationInitializer
SpringBootServletInitializer
ApplicationContext
AbstractDispatcherServletInitializer
SpringApplication
ServletContextAware
尚未成为 Spring 应用程序的应用程序可能可转换为 Spring Boot 应用程序,前面提到的指南可能会有所帮助。
但是,您可能还会遇到问题。
在这种情况下,我们建议在 Stack Overflow 上用 spring-boot
的标签提问。
如果打算将应用程序作为 war 或可执行应用程序启动,则需要在可供回调使用的方法和类似于以下内容的类中共享生成器的自定义项:
|
将 WAR 部署到 WebLogic
要将 Spring Boot 应用程序部署到 WebLogic,您必须确保 servlet 初始值设定项直接实现(即使您从已实现它的基类扩展)。WebApplicationInitializer
WebLogic 的典型初始值设定项应类似于以下示例:
-
Java
-
Kotlin
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
<?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>