Spring Boot 提供了一些包含消息传递的启动器。本节回答使用 Spring Boot 消息时出现的问题。
如果你的 JMS 代理不支持事务会话,则必须完全禁用事务的支持。如果你创建了自己的 @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory( ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory listenerFactory = new DefaultJmsListenerContainerFactory(); configurer.configure(listenerFactory, connectionFactory); listenerFactory.setTransactionManager(null); listenerFactory.setSessionTransacted(false); return listenerFactory; } 前面的示例重写默认工厂,并且应该将其应用于应用程序定义的任何其它工厂(如果有的话)。 本节回答通过 Spring Boot 使用 Spring 批处理产生的问题。
有关 Spring 批处理的更多内容,请参阅 Spring Batch 项目页面。
通过在上下文中添加
默认情况下,它在启动时执行应用程序上下文中的所有作业(详情请参阅 JobLauncherCommandLineRunner)。可以通过指定
如果应用程序上下文包含 更多详细信息请参阅 BatchAutoConfiguration 和 @EnableBatchProcessing。 Spring Boot 包含 Spring Boot 执行器。本节回答使用的常见问题。
在独立的应用程序中,执行器 HTTP 端口默认与主 HTTP 端口相同。要使应用程序在不同的端口上监听,请设置外部属性:
更多详细信息请参阅 Spring Boot 安装了一个白名单错误页面,如果遇到服务器错误,你将在浏览器客户端中看到该错误页面(使用 JSON 和其它媒体类型的机器客户端应该看到具有正确错误代码的合理响应)。
用自己的方式重写错误页面取决于所使用的模板技术。例如,如果使用 Thymeleaf,则可以添加 有关如何在 servlet 容器中注册处理程序的详细信息请参阅 “错误处理” 章节。
Spring Boot 为这些密钥使用合理的默认值:例如,任何以 "password"、"secret"、"key" 或 "token" 结尾的密钥都被清除。也可以使用正则表达式来代替,例如
可以使用 本节讨论使用 Spring Boot 时的安全性问题,包括通过 Spring Boot 使用 Spring Security 时产生的问题。 有关 Spring Security 更多的详细信息请参阅 Spring Security 项目页面。
如果在应用程序中使用
如果提供类型为
添加用户帐户最简单的方法是提供自己的
确保所有的主要端点仅在 HTTPS 上可用是任何应用程序的重要任务。如果使用 Tomcat 作为 servlet 容器,那么 Spring Boot 在检测到某些环境设置时自动添加 Tomcat 自己的 server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.protocol-header=x-forwarded-proto
(这两种属性中的任何一种都存在于阀门上。或者,你可以通过添加
要将 Spring Security 配置为需要用于所有(或一些)请求的安全通道,请考虑添加你自己的 @Configuration public class SslWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // Customize the application security http.requiresChannel().anyRequest().requiresSecure(); } } Spring Boot 支持热交换。本节回答有关它如何工作的问题。
热重新加载有几种选择。推荐的方法是使用 或者,在 IDE 中运行(尤其是在调试上)是一种很好的开发方法(所有的现代 IDE 都允许重新加载静态资源,通常也允许 Java 类更改的热交换)。
最后,可以配置 Maven 和 Gradle插件(详见
Spring Boot 支持的大多数模板技术都包含禁用缓存的配置选项(本文稍后描述)。如果使用
如果你使用 Thymeleaf,将
如果你使用 FreeMarker,将
如果你使用 Groovy 模版,将
更多详细信息请参阅 小节 20, 开发者工具 部分。 Spring Boot 包含 Maven 和 Gradle 的构建插件。本节回答关于这些插件的常见问题。
Maven 插件和 Gradle 插件都允许生成包含项目坐标、名称和版本的构建信息。插件还可以被配置为通过配置添加附加属性。当存在这样一个文件时,Spring Boot 会自动配置
若要使用 Maven 生成构建信息,请为 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.0.BUILD-SNAPSHOT</version> <executions> <execution> <goals> <goal>build-info</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
下面的例子使用 Gradle 做相同的事: springBoot { buildInfo() }
Maven 和 Gradle 都允许生成
对于 Maven 用户, <build> <plugins> <plugin> <groupId>pl.project13.maven</groupId> <artifactId>git-commit-id-plugin</artifactId> </plugin> </plugins> </build>
Gradle 用户可以通过使用 plugins { id "com.gorylenko.gradle-git-properties" version "1.5.1" }
如果你使用 Maven 构建,并直接或间接从 <properties> <slf4j.version>1.7.5<slf4j.version> </properties>
要覆盖 Gradle 中的依赖项版本,请参阅 Gradle 插件的文档的这一部分。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
如果不使用父 POM,仍然可以使用插件。但是,你必须另外添加一个 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.0.BUILD-SNAPSHOT</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 完整的使用详细信息请参阅插件文档。 类似于 war 文件,Spring Boot 应用程序不打算用作依赖项。如果你的应用程序包含希望与其它项目共享的类,推荐的方法是将该代码移动到单独的模块中。单独的模块可以依赖于你的应用程序和其它项目。
如果不能按照上面的建议重新排列代码,则 Spring Boot 的 Maven 和 Gradle 插件必须被配置为生成适合用作依赖项的独立构件。可执行归档文件不能用作依赖项,因为可执行 jar 格式将应用程序类封装在 为了产生两个构件,一个可以用作依赖项,一个是可执行的,必须指定分类器。此分类器应用于可执行文件的名称,留下默认的档案作为依赖项使用。
若要配置 Maven 中的 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
在可执行的 jar 中,大多数嵌套库不需要解包以便运行。但是,某些库可能存在问题。例如,JRuby 包含它自己的嵌套 jar 支持,它假定 为了处理任何有问题的库,你可以标记当可执行 jar 首次运行时,应该将特定的嵌套 jar 自动解压缩到 temp 文件夹。 例如,为了指示 JRuby 应该被标记为使用 Maven 插件进行拆包,你需要添加以下配置: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <requiresUnpack> <dependency> <groupId>org.jruby</groupId> <artifactId>jruby-complete</artifactId> </dependency> </requiresUnpack> </configuration> </plugin> </plugins> </build>
通常,如果将可执行和不可执行 jar 作为两个独立的构建产品,那么可执行版本具有库 jar 中不需要的附加配置文件。例如, 在 Maven中,可执行 jar 必须是主要工件,并且可以为该库添加分类 jar,如下: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>lib</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> <configuration> <classifier>lib</classifier> <excludes> <exclude>application.yml</exclude> </excludes> </configuration> </execution> </executions> </plugin> </plugins> </build>
要用 Ant 构建,需要抓取依赖项、编译、然后创建 jar 或 war 存档。为了使它可执行,你可以使用
下面的示例演示如何使用 Ant 构建可执行归档: <target name="build" depends="compile"> <jar destfile="target/${ant.project.name}-${spring-boot.version}.jar" compress="false"> <mappedresources> <fileset dir="target/classes" /> <globmapper from="*" to="BOOT-INF/classes/*"/> </mappedresources> <mappedresources> <fileset dir="src/main/resources" erroronmissingdir="false"/> <globmapper from="*" to="BOOT-INF/classes/*"/> </mappedresources> <mappedresources> <fileset dir="${lib.dir}/runtime" /> <globmapper from="*" to="BOOT-INF/lib/*"/> </mappedresources> <zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" /> <manifest> <attribute name="Main-Class" value="org.springframework.boot.loader.JarLauncher" /> <attribute name="Start-Class" value="${start-class}" /> </manifest> </jar> </target>
Ant 示例有一个 $ ant -lib <folder containing ivy-2.2.jar> clean manual 然后可以用以下命令运行应用程序: $ java -jar target/*.jar Spring Boot 支持传统部署以及更现代的部署形式。本节回答了关于传统部署的常见问题。
生成可部署 war 文件的第一步是提供 @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
下一步是更新构建配置,以便项目生成 war 文件而不是 jar 文件。如果使用 Maven 和 <packaging>war</packaging>
如果使用 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' // … }
如果使用 Spring Boot 构建工具,将嵌入的 servlet 容器依赖项标记为已提供,将生成一个可执行 war 文件,其中提供的依赖项打包在
对于非 Web 应用程序,将现有的 Spring 应用程序转换为 Spring Boot 应用程序应该是容易的。为此,丢弃创建
要通过扩展 @SpringBootApplication public class Application 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 (via @SpringBootApplication) // we actually don't need to override this method. return application; } }
记住,无论你在源代码中使用什么,都只是一个 Spring
静态资源可以在类路径根目录中移动到
常规使用 Spring
当 war 文件工作时,你可以通过向应用程序添加一个主方法来使其可执行,如下面的示例所示: public static void main(String[] args) { SpringApplication.run(Application.class, args); }
应用程序可以分为多个类别:
所有这些都应该适合转译,但每个可能需要略微不同的技术。
如果它们已经使用 Servlet 3.0+ 初始化器支持类,则 Servlet 3.0+ 应用程序可以很容易地转译。通常,来自现有
还不是 Spring 应用程序的应用程序可以转换为 Spring Boot 应用程序,前面提到的指导可能有帮助。然而,你可能会遇到问题。在这种情况下,我们建议用
要将 Spring Boot 应用程序部署到 WebLogic,必须确保 servlet 初始化器直接实现 WebLogic 的一个典型初始化器应该类似于下面的示例: 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 { }
如果使用 Logback,还需要告诉 WebLogic 更喜欢打包的版本,而不是预先安装到服务器上的版本。你可以通过添加 <?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 http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://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>
默认情况下,Spring Boot 启动器( 下面的示例展示了如何在 Maven 中如何做: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> 下面的示例展示了如何在 Gradle 中如何做: configurations { compile.exclude module: "lettuce" } dependencies { compile("redis.clients:jedis") // ... } |