使用Java 17启动JBoss EAP 6.1时遇FactoryConfigurationError错误求助
解决JBoss EAP 6.1在Java 17下启动的XMLStreamFactory访问错误
错误根源
JBoss EAP 6.1是2013年发布的旧版本,仅原生支持Java 6/7。Java 9引入的模块系统(JPMS)启用了强封装机制,限制了对JDK内部API的反射访问。你遇到的错误核心是:__redirected.__XMLInputFactory 无法访问JDK内部类 com.sun.xml.internal.stream.XMLInputFactoryImpl,因为java.xml模块未将com.sun.xml.internal.stream包导出给未命名模块(JBoss旧类加载器加载的代码属于未命名模块)。
解决方案
1. 补充模块访问权限参数
在你的JAVA_OPTS中添加以下--add-opens参数,开放JDK内部包的访问权限:
--add-opens java.xml/com.sun.xml.internal.stream=ALL-UNNAMED
如果后续仍出现类似JAXP相关的访问错误,可以追加以下参数:
--add-opens java.xml/com.sun.xml.internal.stream.events=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xerces.internal.impl=ALL-UNNAMED
2. 完整示例JAVA_OPTS
更新后的JAVA_OPTS如下:
-XX:+TieredCompilation -XX:+UseCompressedOops -Dprogram.name=standalone.bat -Dexo.jcr.session.tracking.active=false -Xms512m -Xmx2g --add-opens java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens java.xml/com.sun.xml.internal.stream=ALL-UNNAMED --add-opens java.xml/com.sun.xml.internal.stream.events=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xerces.internal.impl=ALL-UNNAMED -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Duser.language=en -Duser.region=US -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dgatein.assets.version=4.0.7 -Djava.util.Arrays.useLegacyMergeSort=true -Dorg.jboss.resolver.warning=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djboss.server.default.config=standalone-exo.xml -Dorg.jboss.as.logging.per-deployment=false
为什么Wildfly 10的方案不适用
Wildfly 10的模块系统和JAXP重定向逻辑比JBoss EAP 6.1更完善,针对Java 17的适配参数与EAP 6.1不兼容,直接套用无法解决问题。
长期建议
JBoss EAP 6.1早已停止官方维护,即使通过添加参数临时启动,后续仍会遇到大量Java 17的兼容性问题。建议升级到支持Java 17的新版本,比如JBoss EAP 7.4+或Wildfly 26及以上版本。
内容的提问来源于stack exchange,提问作者Simone Traversi
相关产品推荐
相关产品推荐

