Использование Spring Boot 2.0 с Tomcat 7.0.82

У меня есть проект, использующий Spring Boot 2.0.0.RC2. Мне нужно развернуть его в клиентской среде, используя традиционное развертывание для Tomcat 7.0.82. Мне удалось создать войну, которую можно успешно развернуть, настроив web.xml типичным способом для приложений Spring (с DispatcherServlet) вместо использования SpringBootServletInitializer.

Я также хотел бы иметь быстрый способ запуска приложения в локальной среде с использованием встроенного контейнера Tomcat, просто запустив основной метод в классе приложения с аннотацией @SpringBootApplication. Он отлично работает, если я использую версию Tomcat по умолчанию (8.5.28). Однако я хотел бы запустить встроенный контейнер и в версии 7.0.82. Это важно для меня по другой причине — я использую SpringBootTest, и было бы неплохо, если бы эти тесты выполнялись в том же контейнере, что и клиентская среда. К сожалению, я не могу использовать родительский POM Spring Boot и переопределить свойство tomcat.version.

Я пробовал @SpringBootApplication(exclude = ServletWebServerFactoryAutoConfiguration.class) создать TomcatServletWebServerFactory компонент вручную

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

и явно добавьте зависимости tomcat 7.0.82 в pom.xml (${tomcat.version} = 7.0.82):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-annotations-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-annotations-api</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-util</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-websocket</artifactId>
    <version>${tomcat.version}</version>
</dependency>

но я все еще получаю ошибку java.lang.NoClassDefFoundError: org/apache/tomcat/util/scan/StandardJarScanFilter.

Не могли бы вы сообщить, есть ли способ удовлетворить мои требования?


person MateuszPrzybyla    schedule 27.02.2018    source источник
comment
Понизив Spring Boot до ветки 1.5. Для Spring Boot 2.0 требуется контейнер Servlet 3.1. Tomcat 7 — это контейнер Servlet 3.0.   -  person M. Deinum    schedule 27.02.2018
comment
Я хотел бы избежать этого, если это возможно - я бы предпочел найти решение для Spring Boot 2.0, так как я хотел бы иметь поддержку JUnit5.   -  person MateuszPrzybyla    schedule 27.02.2018
comment
Для Spring Boot 2 требуется Spring 5, для которого требуется контейнер Servlet 3.1. Ваш единственный вариант - перейти на более раннюю версию, если это только для jUnit 5, есть также поддержка jUnit 5 для Spring 4.3. См. github.com/sbrannen/spring-test-junit5. Или обновитесь до Tomcat 8.5 (официальный контейнер 3.1).   -  person M. Deinum    schedule 27.02.2018
comment
@M.Deinum M.Deinum - я понизил версию до 1.5.10.RELEASE, и теперь у меня есть встроенный контейнер в версии 7.0.82. Но что интересно, я просмотрел версии зависимостей, которые Spring Boot 1.5.10.RELEASE использует Servlet API также в версии 3.1.0. Есть идеи, почему тогда это работает для 1.5.10.RELEASE, а не для 2.0.0.RC2?   -  person MateuszPrzybyla    schedule 27.02.2018
comment
Потому что это не минимальная требуемая версия, поскольку это API Servlet 3.0.   -  person M. Deinum    schedule 27.02.2018
comment
Любой источник? Я не вижу его нигде в документах.   -  person MateuszPrzybyla    schedule 28.02.2018
comment
Как уже говорилось, его нет в документах Spring Boot, он есть в документах Spring.   -  person M. Deinum    schedule 28.02.2018


Ответы (1)


Spring boot 2: минимальная поддерживаемая версия Tomcat — 8.5.

Ссылка: https://dzone.com/articles/spring-boot-20-new-features-infrastructure-changes

person Lucas Moyano Angelini    schedule 11.09.2018
comment
Не могли бы вы поделиться ссылкой на официальный документ? - person ssasi; 19.03.2019
comment
Вот официальные примечания к выпуску Spring Boot на GitHub: github.com/spring-projects/spring-boot/wiki/ Ссылка выше не может считаться официальным ресурсом. - person Victor; 04.06.2019