0

我有一个 Spring Boot 应用程序,其中一个依赖项是使用 spring 和嵌入式码头来启动 ad-hoc web 服务器。这导致我的 Spring Boot 应用程序在码头而不是 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>

依赖项:

<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 boot 显式使用,而不是由依赖树推断?

编辑

我进一步调查了这个问题并创建了一个 repo 来重现这个问题:github.com/svettwer/spring-server-test
org.eclipse.jetty.websocket:javax-websocket-server-impl导致 spring 从 jetty 开始,不需要任何其他配置。

编辑 2

Spring Boot 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>
4

2 回答 2

0

本指南可能会对您有所帮助: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 更喜欢码头 - 但你希望你能明白......

希望这可以帮助。

于 2018-05-24T10:04:12.127 回答
0

通常,如果您spring-boot-starter-tomcat的类路径中有 (通过spring-boot-starter-web),它应该始终选择 Tomcat,因为它优先于其他 servlet 容器。即使你有以下依赖,Spring boot 也会以 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>

您可以通过注册自己的 以编程方式覆盖所选的 servlet 容器ServletWebServerFactory,例如:

@Bean
public ServletWebServerFactory factory() {
    return new TomcatServletWebServerFactory();
}

您可以选择预定义的TomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory.

于 2018-05-24T11:42:35.747 回答