半步多 玄玉的博客

CXF之LinkageError异常及endorsed机制

2013-06-22
玄玉

现象

CXF启动时可能会报告下面的异常

Exception in thread "main" java.lang.LinkageError: JAXB 2.1 API is being loaded from the bootstrap classloader,
but this RI (from jar:file:/C:/apache-cxf-2.5.2/lib/jaxb-impl-2.2.4-1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.2 API.
Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)

大致翻译下,就是说:

Jaxb2.1的API正在从根类加载器中加载,但这个参考实现(jaxb-impl-2.2.4-1.jar)需要一个2.2的API

请使用endorsed目录机制来替换掉根类加载器中的jaxb-api.jar

请参考http://java.sun.com/j2se/1.5.0/docs/guide/standards/

分析

这是由于JDK启动时加载的是自带的jaxb-api-2.1.jar,而这里的CXF需要用到的是jaxb-api-2.2.jar

  • 注意

    1、不是让你去下载jaxb-api.jar,而是应该下载jaxb-api-2.2.jar
      可以从https://jaxb.java.net/下载
      或从apache-cxf-2.5.2.zip\apache-cxf-2.5.2\lib\endorsed目录中取得
    2、不是让你把下载到的jar放到%JAVA_HOME%/lib/endorsed/目录下,而是应该自己找到正确的目录

  • 找到正确目录的方法,还要根据JavaProject还是JavaWebProject而不同

    1、JavaProject就简单多了
      直接main执行System.out.println(System.getProperty("java.endorsed.dirs"));
      我的电脑上显示的是D:\Develop\Java\jdk1.6.0_45\jre\lib\endorsed
    2、JavaWebProject的话,就要启动一个没有用到jaxb的Web项目
      然后在jsp中执行<%=System.getProperty("java.endorsed.dirs")%>
      我的电脑上显示的是D:\Develop\apache-tomcat-6.0.36/common/endorsed

解决

第一种

jaxb-api-2.2.jar放到上面找到的正确的endorsed目录中,即可

第二种

第二种是在Eclipse中启动JavaProject的情况而言的

main-->Run As-->Open Run Dialog或者Run Configurations-->Arguments-->VM arguments

再输入此参数:-Djava.endorsed.dirs=C:\apache-cxf-2.5.2\lib\endorsed

保存,即可


Content