设为首页 收藏本站
查看: 2175|回复: 0

[经验分享] Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 问题排查

[复制链接]

尚未签到

发表于 2017-12-25 07:40:02 | 显示全部楼层 |阅读模式
  自定义的classLoader启动spring容器,遇到
  Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not subtype (classpath下有类)
  和
  Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found(classpath下没有类)
  两个异常信息。
  这个问题比较诡异,缺少包和没有包都有问题,有包的情况下报 not subtype(这个应该是classLoader之间的问题,直接调整类的加载策略为双亲委派策略,问题解决),没包的情况报 not found。只能走上排查之路了。
  先根据堆栈进入到源码,
  Caused by: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found
  at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)
  at com.ibatis.common.xml.NodeletParser.createDocument(NodeletParser.java:165)
  at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:59)
  at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:62)
  at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:55)
  at org.springframework.orm.ibatis.SqlMapClientFactoryBean.buildSqlMapClient(SqlMapClientFactoryBean.java:338)
  at org.springframework.orm.ibatis.SqlMapClientFactoryBean.afterPropertiesSet(SqlMapClientFactoryBean.java:291)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1648)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585)
  ... 38 common frames omitted
  xml的解析工具在实例化的时候出现了错误,比较奇怪的是,其他使用了相同框架的模块并不会出现这个问题。先打开日志输出的参数,在jvm的启动参数中增加 -Djaxp.debug=true
  这个参数打开之后,可以输出 DocumentBuilderFactory 在实例化时会使用哪个具体的实现类去实例化。
  JAXP: find factoryId =javax.xml.transform.TransformerFactory
  JAXP: loaded from fallback value: com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

  JAXP: created new instance of>  JAXP: find factoryId =javax.xml.parsers.SAXParserFactory
  JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

  JAXP: created new instance of>  正常的情况下,会优先使用你的配置类。你可以在 systemProperty中配置具体使用哪个类。如果没有配置,会使用 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 的实现类,是jdk8中自带的实现类。
  默认的 fallback类为:com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
  注意这一小段代码,在classpath下寻找fallback类,如果没有找到,使用默认的fallback类,这个自动在包中搜索的,所以只要你的包中有相关的实现类,就会被加载并且实例化。
  // Try Jar Service Provider Mechanism
  T provider = findServiceProvider(type);
  if (provider != null) {
  return provider;
  }
  那问题其实已经很明确了,在classpath目录下找找是不是有相关的类,将相关的依赖包排除掉即可。
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <groupId>xml-apis</groupId>
  <artifactId>xml-apis</artifactId>
  都让它使用默认的Factory类。排除掉之后,问题解决。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427707-1-1.html 上篇帖子: log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignab 下篇帖子: Apache ActiveMQ Fileserver远程代码执行漏洞
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表