如何通过Eclipse Transformer Maven插件解决Spring Boot3的javax/jakarta依赖冲突?
解决Spring Boot 3与Katharsis/Crnk的Jakarta Servlet兼容问题
核心问题分析
Spring Boot 3全面切换到Jakarta EE API(jakarta.servlet.*),而停更的Katharsis及其继任者Crnk仍依赖旧的Java EE API(javax.servlet.*),导致编译时出现javax.servlet.Filter找不到、KatharsisFilterV2类型不兼容的错误。以下是几种可落地的解决方案:
方案一:修复Eclipse Transformer Maven插件配置
手动CLI转换可行但无法自动化,核心是调整插件的执行时机、依赖范围和仓库优先级,确保转换后的包被优先加载。
1. 父POM全局配置插件
在父POM的pluginManagement中统一配置转换器,确保多模块项目同步生效:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.eclipse.transformer</groupId> <artifactId>transformer-maven-plugin</artifactId> <version>0.4.0</version> <!-- 使用最新稳定版 --> <executions> <execution> <id>transform-katharsis-deps</id> <phase>initialize</phase> <!-- 提前到依赖解析前执行 --> <goals> <goal>transform</goal> </goals> <configuration> <!-- 转换所有Katharsis相关依赖 --> <transformations> <transformation> <groupId>io.katharsis</groupId> <artifactId>katharsis-spring</artifactId> <version>${katharsis.version}</version> <rules>org.eclipse.transformer.jakarta</rules> <!-- javax转jakarta规则 --> </transformation> <transformation> <groupId>io.katharsis</groupId> <artifactId>katharsis-core</artifactId> <version>${katharsis.version}</version> <rules>org.eclipse.transformer.jakarta</rules> </transformation> </transformations> <!-- 输出转换后的包到项目临时目录,避免污染本地仓库 --> <outputDirectory>${project.build.directory}/transformed-deps</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> <!-- 配置仓库优先级:转换后的本地目录优先于中央仓库 --> <repositories> <repository> <id>transformed-local</id> <url>file://${project.build.directory}/transformed-deps</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </repository> <repository> <id>maven-central</id> <url>https://repo1.maven.org/maven2</url> </repository> </repositories>
2. 子模块启用插件
子模块无需重复配置,只需继承父POM并声明插件:
<build> <plugins> <plugin> <groupId>org.eclipse.transformer</groupId> <artifactId>transformer-maven-plugin</artifactId> </plugin> </plugins> </build>
方案二:使用OpenRewrite自动迁移依赖
OpenRewrite提供成熟的Jakarta迁移规则,可批量转换依赖中的javax类为jakarta,同时支持项目代码的迁移(可选)。
配置OpenRewrite插件
<build> <plugins> <plugin> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> <version>5.40.0</version> <configuration> <activeRecipes> <recipe>org.openrewrite.java.jakarta.JavaxMigrationToJakarta</recipe> <recipe>org.openrewrite.java.spring.boot3.SpringBoot3Migration</recipe> </activeRecipes> <!-- 仅转换依赖,不修改项目代码(可选) --> <exclusions> <exclusion>**/src/main/java/**</exclusion> <exclusion>**/src/test/java/**</exclusion> </exclusions> </configuration> <dependencies> <dependency> <groupId>org.openrewrite.recipe</groupId> <artifactId>rewrite-spring</artifactId> <version>5.40.0</version> </dependency> </dependencies> </plugin> </plugins> </build>
执行转换命令:
mvn rewrite:run
方案三:预转换依赖并上传私有仓库
如果插件配置始终无法生效,可提前手动转换Katharsis包,上传到私有Maven仓库(如Nexus/Artifactory),项目直接依赖转换后的版本:
1. CLI转换并上传(本地示例)
# 下载原依赖包 mvn dependency:get -DgroupId=io.katharsis -DartifactId=katharsis-spring -Dversion=3.0.2 -Ddest=katharsis-original.jar # 用Transformer CLI转换 java -jar transformer-cli-0.4.0.jar -rules jakarta katharsis-original.jar katharsis-jakarta-3.0.2.jar # 安装到本地仓库(或上传到私有仓库) mvn install:install-file -Dfile=katharsis-jakarta-3.0.2.jar -DgroupId=io.katharsis -DartifactId=katharsis-spring -Dversion=3.0.2-jakarta -Dpackaging=jar
2. 项目依赖转换后的版本
<dependency> <groupId>io.katharsis</groupId> <artifactId>katharsis-spring</artifactId> <version>3.0.2-jakarta</version> </dependency>
在CI/CD中,可将转换+上传步骤封装为脚本,提前预构建依赖包。
方案四:替换为活跃维护的替代库
如果上述方案仍无法解决长期维护问题,建议替换为适配Spring Boot 3的REST API框架:
- Spring Data REST:官方原生支持,完全适配Jakarta EE,无需额外兼容处理
- Quarkus REST Data with Panache:适合微服务场景,天然支持Jakarta
- OpenAPI Generator:可生成符合规范的REST接口代码,灵活适配Spring Boot 3
内容的提问来源于stack exchange,提问作者Joshua Steele
相关产品推荐
相关产品推荐

