登录时出现java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter的解决方法
解决方案:解决java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
1. 完善JAXB依赖配置
确保pom.xml中引入完整的JAXB API与实现依赖,且依赖范围正确(Java 9+不再默认提供这些类),推荐配置如下:
<!-- JAXB API核心 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- JAXB实现类 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency> <!-- JAXB核心工具类 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <!-- 激活依赖(兼容旧版本需求) --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
如果是Spring Boot项目,可直接引入starter简化配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jaxb</artifactId> </dependency>
2. 适配Java 9+模块系统
若项目运行在Java 9及以上版本,需在maven-compiler-plugin中添加模块参数,确保JAXB模块被加载:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <!-- 替换为你的Java版本 --> <target>11</target> <compilerArgs> <arg>--add-modules</arg> <arg>java.xml.bind</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
3. 替换代码中的JAXB依赖
若你的signIn方法或WebSecurityConfig中直接调用了DatatypeConverter(比如Base64编解码),可以替换为Java自带的java.util.Base64类,彻底摆脱JAXB依赖:
// 原代码 String encoded = DatatypeConverter.printBase64Binary(data); byte[] decoded = DatatypeConverter.parseBase64Binary(encoded); // 替换后 String encoded = Base64.getEncoder().encodeToString(data); byte[] decoded = Base64.getDecoder().decode(encoded);
4. 清理并重建项目
执行以下Maven命令,清理缓存并重新构建,确保依赖正确生效:
mvn clean install
5. 排查依赖冲突
运行依赖树命令,检查是否有JAXB相关依赖被意外排除:
mvn dependency:tree | grep jaxb
若发现排除情况,在对应依赖中添加<exclusions>取消排除,或调整依赖声明顺序。
内容的提问来源于stack exchange,提问作者denstran
相关产品推荐
相关产品推荐

