You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:59:39