关于weblogic部署Java项目的包冲突问题的解决
作者:sunshine6 发布时间:2023-07-19 19:02:59
我们可能会用各种应用服务部署我们的Java应用,比如Tomcat、WAS、weblogic等。Tomcat和WAS可能会比较少遇到一些奇怪的问题,但是用weblogic部署项目则经常遇到一些比如包冲突问题,路径问题等奇怪但又常见的问题。
今天我就讲讲关于weblogic部署Java项目包冲突的问题。下面我举个例子:
当我在weblogic部署Java项目之后,启动没报任何错,没有异常。但是当 * 作某个功能的时候页面就报错了:
后台报了这个错:
Root cause of ServletException.
java.lang.LinkageError: loader constraint violation: loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
previously initiated loading for a different type with name "javax/xml/namespace/QName"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:343)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:302)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)
at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:49)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at org.apache.xmlbeans.XmlBeans.buildMethod(XmlBeans.java:174)
at org.apache.xmlbeans.XmlBeans.buildNoArgMethod(XmlBeans.java:190)
at org.apache.xmlbeans.XmlBeans.buildGetContextTypeLoaderMethod(XmlBeans.java:200)
at org.apache.xmlbeans.XmlBeans.<clinit>(XmlBeans.java:126)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook$Factory.newInstance(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:290)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:170)
at com.kayak.web.base.util.export.ExportExcelXSSF.export(ExportExcelXSSF.java:893)
at com.kayak.web.base.action.ExportExcelAction.exportExcel(ExportExcelAction.java:318)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at com.kayak.web.user.filter.LoginCertifyFilter.doFilter(LoginCertifyFilter.java:125)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at com.kayak.web.base.filter.LocalRequestFilter.doFilter(LocalRequestFilter.java:28)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1499)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
错误内容很长,但是要学会辨认,我刚开始就被一大堆错误误导了。关键的都是下面的这个:
loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
previously initiated loading for a different type with name "javax/xml/namespace/QName"
大概意思就是“加载器之前启动的时候加载了名字叫javax/xml/namespace/QName的其他类型的类”。其实转换一下就是,在启动的时候加载了一个javax/xml/namespace/QName类,我们现在要用的功能需要一个类也叫javax/xml/namespace/QName,但是这个不是我们真正想要的class。
从上面的意思可以知道,这就是有两个相同包包路径和类名称的class,但是有一个想要的却没有,只有一个我们并不想要的class。了解weblogic部署的同学都知道,weblogic加载了一个相同的class就不会在加载其他一样的class了。
当我再操作一次的之后又报另一个错(部分错误内容):
Root cause of ServletException.
java.lang.NoClassDefFoundError: Could not initialize class org.apache.xmlbeans.XmlBeans
at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook$Factory.newInstance(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:290)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:170)
at com.kayak.web.base.util.export.ExportExcelXSSF.export(ExportExcelXSSF.java:893)
at com.kayak.web.base.action.ExportExcelAction.exportExcel(ExportExcelAction.java:318)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
就是说不能初始化classorg.apache.xmlbeans.XmlBeans。但是我们不要被这个所误导,关键还是在于上面的javax/xml/namespace/QName ,就是因为这个冲突了所以才会导致后面的问题发生。
我用 jfind.jar 在项目下的lib目录下搜索发现在axis-jaxrpc-1.4.jar下有javax/xml/namespace/QName.class文件。因为在jdk下的 rt.jar 下面也有javax/xml/namespace/QName.class所以就会有两个一样的class文件。
后面我发现在项目的 WEB-INF 下面有个weblogic.xml 文件,里面就有一些关于weblogic的配置:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
</charset-params>
</weblogic-web-app>
这个配置文件里的第4行配置就是只先加载项目里的class文件,再加载weblogic的class,也就是因为这个配置而导致了项目里的axis-jaxrpc-1.4.jar下有javax/xml/namespace/QName.class,jdk下的rt.jar 下面也有javax/xml/namespace/QName.class却没有加载到,但是后者才是程序所需要的。
因此,我就尝试把weblogic.xml的第4行配置 改成 false,重新打war包,重新部署,然后发现问题解决了。
接着我又换了一种尝试,就是weblogic.xml的第4行配置依然是true ,但是我把项目里那个冲突的class所在的包 axis-jaxrpc-1.4.jar 删了,也重新打包部署,也没有问题了。所以到此就把问题给解决了
总结:
1. 在weblogic中部署Java应用时,经常遇到包冲突问题,其实首先可以通过修改weblogic.xml配置来解决,另一种方式就是通过jfind.jar 找出冲突的class所在的包,直接把这个包删了,可以解决。
2. 包冲突问题都可以通过上面的两种方式解决,还有就是 有时候可能会包找不到某个class文件,其实很有可能就是因为class文件冲突,以及先后加载的顺序问题,导致我们项目中真正需要的class文件却没有被加载进来。
来源:http://www.cnblogs.com/sunshine6/p/10301372.html


猜你喜欢
- Rmb.javapublic class Rmb { /** *人民币的基本信息和操作 *@auth
- NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子
- 本文实例讲述了C#基于委托实现多线程之间操作的方法。分享给大家供大家参考,具体如下:有的时候我们要起多个线程,更多的时候可能会有某个线程会去
- javax.el.ELException的解决方式failed to parse the expression [${xxx}]Tomcat
- 本文实例为大家分享了C#实现套接字发送接收数据的具体代码,供大家参考,具体内容如下服务端namespace TestServer{ &nbs
- 本文实例为大家分享了RecyclerView实现侧滑拖拽功能的具体代码,供大家参考,具体内容如下准备ItemDragListenerpack
- 本文实例讲述了java可变参数当做数组处理的方法.分享给大家供大家参考,具体如下:java可变参数当做数组处理ava1.5增加了新特性:可变
- 项目中肯定会遇到需要用户自己绘制地形的需求,然后根据地形自动生成房间。下面说说我在绘制地形的实现方法。我们百度可以看到很多关于自己创建mes
- 之前在工作中,需要实现Word打印功能,并且插入图片。当时采取的方式则是使用书签进行操作。首先在word内插入书签,完成后,存为模板。程序加
- 背景最近在着手公司框架优化及项目实际应用,原先方案是springboot+html前后端分离单独部署,后端人员兼职前端开发,后续产品线业务进
- 这篇文章主要介绍了Java实现TCP/IP协议的收发数据(服务端)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- WinForm RichTextBox文本动态滚动显示文本方在RichTextBox动态显示一些文本信息时,需要一些设置,显示当前要显示的字
- 特简单, 没有数据库, 还没有处理各种异常。登录:输入用户名点击的登录即可。发送消息: 特定格式->toUser:message1.
- 前言如果你想玩转C# 里面多线程,工厂模式,生产者/消费者,队列等高级操作,就可以和我一起探索这个强大的线程安全提供阻塞和限制功能的C#神器
-   考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决
- 本文实例为大家分享了Java实现通讯录管理系统的具体代码,供大家参考,具体内容如下题目:1、完成一个通讯录,需求:(1)添加联系人(联系人:
- 在实际项目中,Java有时候需要调用C写出来的东西,除了JNI以外,我认为一种比较好的方法是JAVA调用Shell。先把C写出来的make成
- Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一
- 一、需求描述拼图是一款益智类经典游戏了,本游戏学习了一些前辈们的经验,整体来说讲,将图片用切图工具进行切割,监听用户手指滑动事件,当用户对凌
- 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实