Java 17迁移遇split package问题:jaxrs-api与guava依赖冲突
Java 17迁移中第三方依赖split package冲突解决方案
针对你遇到的javax.annotation拆分包问题(模块系统报错module slf4j.api reads package javax.annotation from both jsr305 and jaxrs.api),可以试试以下几种解决思路:
强制统一依赖版本并排除冲突包
在Maven的dependencyManagement节点中锁定官方的javax.annotation-api,同时排除第三方依赖中自带的冲突包:<dependencyManagement> <dependencies> <!-- 强制所有依赖使用官方统一的javax.annotation-api --> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> <scope>compile</scope> </dependency> <!-- 给jaxrs-api排除所有额外依赖(若它自身打包了javax.annotation类,需结合Shade插件处理) --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>jaxrs-api</artifactId> <version>你的项目使用版本</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 排除guava依赖的jsr305包 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>你的项目使用版本</version> <exclusions> <exclusion> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement>用Maven Shade插件移除重复类
如果第三方依赖自身打包了javax.annotation的类(而非通过依赖引入),可以用Shade插件在构建时删除这些重复类,只保留官方包的内容:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <!-- 移除jaxrs-api中的javax.annotation包类 --> <filter> <artifact>org.jboss.resteasy:jaxrs-api</artifact> <excludes> <exclude>javax/annotation/**</exclude> </excludes> </filter> <!-- 移除jsr305中的javax.annotation包类 --> <filter> <artifact>com.google.code.findbugs:jsr305</artifact> <excludes> <exclude>javax/annotation/**</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>使用--patch-module参数修补模块
针对Java模块系统的拆分包问题,可以通过--patch-module参数,将官方javax.annotation-api的类补丁到冲突的模块中,让模块系统认为该包只有一个来源:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>17</release> <compilerArgs> <!-- 将javax.annotation-api补丁到jaxrs.api模块 --> <arg>--patch-module</arg> <arg>jaxrs.api=${settings.localRepository}/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar</arg> <!-- 将javax.annotation-api补丁到slf4j.api模块 --> <arg>--patch-module</arg> <arg>slf4j.api=${settings.localRepository}/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>注意替换路径为你本地仓库中
javax.annotation-api的实际路径。尝试升级依赖版本
检查jaxrs-api和guava的新版本:- Guava 31.0.1及以上版本已移除对jsr305的依赖,若项目能兼容,升级后可直接避免jsr305带来的冲突;
- Resteasy的新版本可能已调整依赖结构,不再自带
javax.annotation类,改为依赖官方的javax.annotation-api。
内容的提问来源于stack exchange,提问作者Matty Thompson
相关产品推荐
相关产品推荐

