Maven新手求助:如何将JRE添加到项目类路径?
解决Maven打包WAR时找不到JRE内部类的问题
你作为Maven新手遇到的这个错误,核心原因是com.sun.xml.internal.bind.marshaller属于JRE的内部私有API——这类API是JDK内部使用的,默认情况下Maven不会把它们暴露给编译路径,而且Oracle也不建议开发者直接依赖(不同JDK版本或OpenJDK环境里可能直接不存在)。下面给你两种可行的解决思路:
方法一:临时开启内部API访问(应急用)
如果只是临时需要编译通过,可以在pom.xml里给maven-compiler-plugin添加编译参数,强制让JDK暴露这些内部包:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 替换成你项目里的插件版本 --> <configuration> <source>1.8</source> <!-- 对应你的JDK版本 --> <target>1.8</target> <compilerArgs> <arg>-XDignore.symbol.file</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
这个参数会让编译器忽略JDK的符号限制文件,从而允许访问内部API。
方法二:替换为公开标准API(更推荐)
其实你用到的NamespacePrefixMapper有对应的公开替代类——com.sun.xml.bind.marshaller.NamespacePrefixMapper,它在官方JAXB依赖包里。你可以在pom.xml中添加依赖,然后把代码里的导入路径改成这个公开版本:
<dependencies> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.3</version> <!-- 选一个稳定的版本即可 --> <scope>runtime</scope> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> </dependencies>
这种方式的好处是彻底摆脱对JDK内部私有API的依赖,代码在不同JDK环境下的兼容性和可移植性会好很多,也能避免后续JDK版本更新导致的兼容性问题。
额外提醒
- 如果你用的是JDK9及以上版本,JAXB已经从JDK核心模块中移除了,必须手动添加上面的JAXB依赖才能正常使用。
- 尽量避免直接使用
com.sun.*开头的类,这类都是JDK私有API,官方不保证长期兼容,随时可能被移除。
内容的提问来源于stack exchange,提问作者peterremec
相关产品推荐
相关产品推荐

