嵌入式Tomcat加载错误JAXB依赖的原因及解决办法
问题分析与解决
核心原因
- 依赖冲突:项目中存在间接依赖引入了
jaxb-core 2.3.0版本,且该依赖的配置存在错误,导致Tomcat的JarScanner在解析类路径时,错误地将jaxb-api.jar的路径指向了jaxb-core 2.3.0的目录下。 - 本地仓库异常:本地Maven仓库中可能残留了
jaxb-core 2.3.0的错误文件或缓存,导致路径解析混乱。 - JDK与旧版JAXB兼容性:你使用的是高版本JDK(从报错栈的
java.base包可判断是JDK11+),而jaxb 2.2.11是适配JDK8的旧版本,二者兼容性不足可能触发依赖解析异常。
解决步骤
1. 排查并修复依赖冲突
执行Maven命令查看依赖树,定位引入jaxb-core 2.3.0的来源:
mvn dependency:tree -Dincludes=com.sun.xml.bind:jaxb-core
找到对应的依赖后,在pom.xml中排除该冲突版本:
<!-- 示例:假设是xxx:yyy依赖引入了jaxb-core 2.3.0 --> <dependency> <groupId>xxx</groupId> <artifactId>yyy</artifactId> <version>zzz</version> <exclusions> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> </exclusion> </exclusions> </dependency>
2. 清理本地Maven仓库
删除本地仓库中错误的jaxb-core 2.3.0目录(路径为/Users/yb/.m2/repository/com/sun/xml/bind/jaxb-core/2.3.0),然后执行命令重新下载依赖:
mvn clean install -U
-U参数强制更新依赖,确保本地仓库中的Jar包与pom配置一致。
3. 调整Tomcat JarScanner配置(临时规避)
如果暂时无法定位依赖冲突,可以修改代码让Tomcat跳过有问题的Jar扫描:
Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); Context context = tomcat.addWebapp("", "/tmp/my-webapp"); // 获取JarScanner并配置跳过规则 StandardJarScanner jarScanner = (StandardJarScanner) context.getJarScanner(); jarScanner.setScanManifest(false); // 跳过jaxb相关Jar的扫描 jarScanner.setSkipJarNames("jaxb-api.jar,jaxb-core.jar,jaxb-impl.jar"); tomcat.start(); tomcat.getServer().await();
4. 升级JAXB版本适配高版本JDK
将JAXB依赖升级到2.3.1版本(与Tomcat9及高版本JDK兼容性更好),修改pom.xml:
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> </dependency>
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

