是否可以显式配置 spring 引导服务器?
Is it possible to configure the spring boot server explicitly?
我有一个 Spring 启动应用程序,其中一个依赖项使用 spring 和一个嵌入式码头来启动一个临时网络服务器。这导致我的 spring 引导应用程序在码头而不是 tomcat.
中启动
我的 spring-boot-starter-web:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖pom:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-http</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
是否可以将服务器配置为由 spring 显式引导使用,而不是由依赖树推断?
编辑
我进一步调查了这个问题并创建了一个 repo 来重现这个问题:github.com/svettwer/spring-server-test
org.eclipse.jetty.websocket:javax-websocket-server-impl
导致 spring 从 jetty 开始,不需要任何其他配置。
编辑 2
Spring 引导 2.x
中不再存在该问题
编辑 3
我将删除前面提到的 repo,但这里是导致问题的依赖设置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>1.5.7.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Comment that in to start spring with jetty-->
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>javax-websocket-server-impl</artifactId>
<version>9.4.8.v20171121</version>
</dependency>
</dependencies>
本指南可能对您有所帮助:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html
如果您 运行 一个 mvn dependency:tree
并搜索 jetty
,您可能会发现您需要排除它,例如:
spring-boot-starter-jetty
排除在示例中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
码头优于 tomcat - 但你有希望理解这个想法......
希望对您有所帮助。
通常,如果您的类路径中有 spring-boot-starter-tomcat
(通过 spring-boot-starter-web
),它应该总是 select Tomcat,因为它优先于其他 servlet 容器。即使您有以下依赖项,Spring 启动也会以 Tomcat:
启动
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
您可以通过注册自己的 ServletWebServerFactory
以编程方式覆盖所选的 servlet 容器,例如:
@Bean
public ServletWebServerFactory factory() {
return new TomcatServletWebServerFactory();
}
您可以选择预定义的TomcatServletWebServerFactory
、JettyServletWebServerFactory
或UndertowServletWebServerFactory
。
我有一个 Spring 启动应用程序,其中一个依赖项使用 spring 和一个嵌入式码头来启动一个临时网络服务器。这导致我的 spring 引导应用程序在码头而不是 tomcat.
中启动我的 spring-boot-starter-web:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖pom:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-http</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
是否可以将服务器配置为由 spring 显式引导使用,而不是由依赖树推断?
编辑
我进一步调查了这个问题并创建了一个 repo 来重现这个问题:github.com/svettwer/spring-server-test
org.eclipse.jetty.websocket:javax-websocket-server-impl
导致 spring 从 jetty 开始,不需要任何其他配置。
编辑 2
Spring 引导 2.x
中不再存在该问题编辑 3 我将删除前面提到的 repo,但这里是导致问题的依赖设置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>1.5.7.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Comment that in to start spring with jetty-->
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>javax-websocket-server-impl</artifactId>
<version>9.4.8.v20171121</version>
</dependency>
</dependencies>
本指南可能对您有所帮助:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html
如果您 运行 一个 mvn dependency:tree
并搜索 jetty
,您可能会发现您需要排除它,例如:
spring-boot-starter-jetty
排除在示例中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
码头优于 tomcat - 但你有希望理解这个想法......
希望对您有所帮助。
通常,如果您的类路径中有 spring-boot-starter-tomcat
(通过 spring-boot-starter-web
),它应该总是 select Tomcat,因为它优先于其他 servlet 容器。即使您有以下依赖项,Spring 启动也会以 Tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
您可以通过注册自己的 ServletWebServerFactory
以编程方式覆盖所选的 servlet 容器,例如:
@Bean
public ServletWebServerFactory factory() {
return new TomcatServletWebServerFactory();
}
您可以选择预定义的TomcatServletWebServerFactory
、JettyServletWebServerFactory
或UndertowServletWebServerFactory
。