Struts1.3+Spring3.1 JAX-WS+WebLogic12C环境下LinkageError问题求助
嘿,这个java.lang.LinkageError在WebLogic 12c搭配JAX-WS的场景里简直是常客,我帮你整理几个实测有效的解决思路,适配你用的NetBeans 8.0、Java 7、Struts 1.3 + Spring 3.1环境:
调整WebLogic类加载偏好(最推荐)
问题根源是WebLogic自带的JAX-WS类库和你应用WEB-INF/lib中的同名称类(比如javax.xml.namespace.QName)版本不一致,触发类加载器约束冲突。你可以通过weblogic.xml强制WebLogic优先使用应用内的指定包:- 在项目的
WEB-INF目录下创建或修改weblogic.xml文件 - 加入以下配置:
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd"> <container-descriptor> <prefer-application-packages> <package-name>javax.xml.namespace.*</package-name> <package-name>javax.xml.ws.*</package-name> <package-name>com.sun.xml.ws.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>这个配置会让WebLogic优先加载你应用内这些包的类,避免和服务器自带版本冲突。
- 在项目的
清理项目中的冲突依赖
检查你的项目依赖(不管是Maven还是NetBeans手动添加的库),排除重复或冲突的JAX-WS相关jar包:- 如果用Maven,在Spring或其他依赖中排除不必要的JAX-WS传递依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.1.0.RELEASE</version> <exclusions> <exclusion> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> </exclusion> </exclusions> </dependency> - 如果是NetBeans手动管理库,删掉
WEB-INF/lib中重复的jaxws-api.jar、activation.jar等WebLogic已提供的jar包。
- 如果用Maven,在Spring或其他依赖中排除不必要的JAX-WS传递依赖:
标记服务器提供的依赖为Provided
对于WebLogic已经内置的JAX-WS相关依赖(比如jaxws-api),在项目中把它们的依赖范围设为provided,这样NetBeans打包时不会把这些jar包放到WEB-INF/lib里,从根源避免冲突:- Maven示例:
<dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.2.7</version> <scope>provided</scope> </dependency> - NetBeans中:右键项目→属性→库→找到对应jar包→设置作用域为“提供”。
- Maven示例:
调试类加载过程(定位冲突细节)
如果以上方法没解决,你可以添加WebLogic启动参数,查看类加载的详细日志,精准定位哪个jar包在加载冲突类:
在WebLogic的启动脚本(startWebLogic.sh/startWebLogic.cmd)中添加JVM参数:-Dweblogic.utils.classloaders.ChangeAwareClassLoader.verbose=true启动服务器后,日志会输出每个类的加载来源,你就能找到重复加载
QName的jar包,针对性处理。
内容的提问来源于stack exchange,提问作者aich.pom

