Класс инициализатора Spring не найден Tomcat при использовании Java 16

У меня очень простой Gradle ( 7.0-rc-1) скрипт для инициализации единственной конечной точки Spring 5 "hello world" с использованием встроенного экземпляра Tomcat. Исходный код взят из случайного примера, который я нашел в Интернете . Мой пример проекта Gradle можно найти здесь .

Я не уверен, как это работает, но каким-то образом веб-сервер знает, что нужно вызывать WebApplicationInitializer.onStartup(ServletContext) при запуске, чтобы Spring был инициализирован.

Это правильно работает на Java 8; но терпит неудачу, когда я изменяю следующую спецификацию инструментальной цепочки в определении сборки Gradle на Java 16.

      java {
    toolchain {
//        languageVersion = JavaLanguageVersion.of(16)
        languageVersion = JavaLanguageVersion.of(8)
    }
}

При использовании Java 8 Spring инициализируется правильно, и конечная точка работает.

При использовании Java 16 onStartup() не вызывается, поэтому Spring не инициализируется и конечная точка не работает (хотя Tomcat все еще запущен и отвечает с ошибкой).

В журнале отображается сообщение вроде, хотя трассировки стека нет:

      INFO: No Spring WebApplicationInitializer types detected on classpath

Что мне нужно сделать, чтобы это работало на Java 16?

Обратите внимание, что я не хочу использовать пружинную загрузку, пожалуйста, не предлагайте ее.

1 ответ

Я нашел обходной путь, который настраивает Spring и отвечает на /helloконечная точка. Но я не знаю, почему это работает и правильно ли это.

Если кто-то может ответить на вопрос, объяснив, что происходит с Java 16, я с радостью отмечу это как принятый ответ.


Обходной путь

Моя работа - программно добавить ServletContainerInitializer класс.

Итак, где раньше я просто звонил addWebapp() метод:

      tomcat.addWebapp("", appBase);

Теперь я добавляю свой инициализатор Spring явно:

      Context appContext = tomcat.addWebapp("", appBase);
appContext.addServletContainerInitializer(new SpringAppConfig(), null);

Обновленный код на Github.

Другие вопросы по тегам