Почему spring webflux по умолчанию выбирает пристань, а затем терпит неудачу?

Я пытаюсь запустить приложение на основе Spring boot 2.0.0.M7.

Вот зависимости, связанные с Spring, которые у меня есть в моем build.gradle:

compile "org.springframework.boot:spring-boot-starter-webflux:2.0.0.M7"
compile "org.springframework.boot:spring-boot-starter-data-ldap:2.0.0.M7"
compile "org.springframework.boot:spring-boot-starter-actuator:2.0.0.M7"

Основываясь на отчете об автоконфигурации, можно ли сказать, ПОЧЕМУ Spring хочет использовать Jetty в качестве реактивного двигателя по умолчанию (когда на самом деле React Netty является двигателем по умолчанию в соответствии с документами Spring)

отчет об автоконфигурации весенней загрузки (извлечение):

ReactiveWebServerConfiguration.ReactorNettyAutoConfiguration:
  Did not match:
     - @ConditionalOnMissingBean (types: org.springframework.boot.web.reactive.server.ReactiveWebServerFactory; SearchStrategy: all) found beans of type'org.springframework.boot.web.reactive.server.ReactiveWebServerFactory'jettyReactiveWebServerFactory (OnBeanCondition)
  Matched:
     - @ConditionalOnClass found required class 'reactor.ipc.netty.http.server.HttpServer'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)

ReactiveWebServerAutoConfiguration#defaultReactiveWebServerCustomizer matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.reactive.DefaultReactiveWebServerCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ReactiveWebServerConfiguration.JettyAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.eclipse.jetty.server.Server'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - @ConditionalOnMissingBean (types: org.springframework.boot.web.reactive.server.ReactiveWebServerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

Исключение, которое я получаю при запуске приложения:

[0;39morg.springframework.context.ApplicationContextException: Unable to start reactive web server; nested exception is java.lang.NoClassDefFoundError: org/eclipse/jetty/servlet/ServletHolder
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onRefresh(ReactiveWebServerApplicationContext.java:64)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:49)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233)
    at com.xyz.abc.routing.web.ApiApplication.main(ApiApplication.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.NoClassDefFoundError: org/eclipse/jetty/servlet/ServletHolder
    at org.springframework.boot.web.embedded.jetty.JettyReactiveWebServerFactory.createJettyServer(JettyReactiveWebServerFactory.java:96)
    at org.springframework.boot.web.embedded.jetty.JettyReactiveWebServerFactory.getWebServer(JettyReactiveWebServerFactory.java:87)
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.createWebServer(ReactiveWebServerApplicationContext.java:87)
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onRefresh(ReactiveWebServerApplicationContext.java:61)
    ... 16 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.servlet.ServletHolder
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 20 common frames omitted

Как я могу заставить Spring использовать реактор netty?


person Jatin    schedule 11.12.2017    source источник
comment
Если вы посмотрите на отчет, действительно ли используются Netty правила, совпадающие. В вашем списке зависимостей есть что-то, что добавляет Jetty. Запустите gradle dependencies, чтобы увидеть, что тянет Jetty.   -  person M. Deinum    schedule 11.12.2017


Ответы (1)


Как упоминал Мартен, проверьте свои зависимости на наличие зависимости Jetty Server. Spring Boot ищет класс org.eclipse.jetty.server.Server как сигнал о том, что вы выбрали Jetty в качестве сервера.

Попробуйте ./gradlew dependencies и посмотрите, откуда берется эта зависимость.

person Brian Clozel    schedule 11.12.2017
comment
Если зависимости требуется Jetty для собственного функционирования, нет ли способа сказать Spring, чтобы он по-прежнему использовал netty? - person levant pied; 05.04.2019