Tomcat9与Spring Boot依赖适配求助:jboss-logging冲突及版本兼容问题
解决Tomcat9 + Spring Boot 2.5.x的jboss-logging依赖冲突及部署问题
问题背景
- 适配Tomcat9选择Spring Boot 2.5.13版本,但存在jboss-logging依赖冲突
- Spring Boot 3.0.6本地运行正常,但无法部署到Tomcat9,且因Debian 11软件源限制无法升级到Tomcat10
当前pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx</groupId> <artifactId>xxx</artifactId> <version>0.2</version> <name>xxx</name> <!-- FIXME change it to the project's website --> <url>xxxxxx</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <tomcat.version>9.0.43</tomcat.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.5.13</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi</artifactId> <version>2.1.0</version> <type>pom</type> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.5.13</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.5.13</version> </plugin> </plugins> </pluginManagement> </build> <packaging>war</packaging> </project>
解决方案
1. 引入Spring Boot Parent统一依赖管理
通过parent pom自动管理所有Spring Boot相关依赖的版本,避免手动指定版本导致的冲突,同时自动处理依赖传递问题。
2. 排除冲突的jboss-logging依赖
在spring-boot-starter-data-jpa中排除jboss-logging,强制使用Spring Boot兼容的版本。
3. 适配springdoc-openapi版本
Spring Boot 2.5.x不兼容springdoc-openapi 2.x,需降级到1.6.x版本。
4. 优化打包配置
确保spring-boot-maven-plugin正确配置war打包,适配Tomcat9的部署要求。
修改后的pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 引入Spring Boot Parent统一管理依赖版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.13</version> <relativePath/> </parent> <groupId>com.xxx</groupId> <artifactId>xxx</artifactId> <version>0.2</version> <packaging>war</packaging> <name>xxx</name> <url>xxxxxx</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <tomcat.version>9.0.43</tomcat.version> <!-- 指定springdoc适配版本 --> <springdoc.version>1.6.14</springdoc.version> </properties> <dependencies> <!-- 排除jboss-logging冲突 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <!-- 适配Spring Boot 2.5.x的springdoc版本 --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>${springdoc.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 配置war打包,指定启动类 --> <configuration> <mainClass>com.xxx.YourApplicationClass</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
额外验证步骤
- 执行
mvn dependency:tree查看依赖树,确认jboss-logging版本统一且无冲突 - 本地打包war包后,直接部署到Tomcat9测试运行
- 确保Spring Boot启动类继承
SpringBootServletInitializer,适配外部Tomcat部署:
@SpringBootApplication public class YourApplicationClass extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplicationClass.class); } public static void main(String[] args) { SpringApplication.run(YourApplicationClass.class, args); } }
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

