通过weblogic部署我方报表应用,在使用过程中可能会出现一些相关于类冲突的报错信息,这一类问题该如何解决呢?
工具/原料
excel报表开发工具FineReport
1.报错信息
1、报错1java.lang.NoClassDefFoundError:com/sun/xml/stream/XMLReaderImpl报错类:%weblogic_home%/bea/modules目录下的glassfish.jaxws.sjsxp_2.0.1.jar。
2、报错2Web盟敢势袂logic8.1部署WebReport工程时的报错:Error500--InternalServerError枣娣空郅java.lang.NoSuchMethodError:javax.xml.namespace.QName.getPrefix()Ljava/lang/String;atcom.sun.xml.stream.events.XMLEventAllocatorImpl.fillAttributes(XMLEventAllocatorImpl.java:186)atcom.sun.xml.stream.events.XMLEventAllocatorImpl.getXMLEvent(XMLEventAllocatorImpl.java:78)atcom.sun.xml.stream.events.XMLEventAllocatorImpl.allocate(XMLEventAllocatorImpl.java:54)atcom.sun.xml.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:87)atcom.fr.base.xml.XMLableReader.readXMLObject(XMLableReader.java:237)atcom.fr.report.io.core.IOHelper.generateTemplate(IOHelper.java:276)atcom.fr.report.io.TemplateImporter.generate(TemplateImporter.java:16)atcom.fr.web.core.SessionIDInfor$EmbeddedTpl.gen(SessionIDInfor.java:1568)atcom.fr.web.core.SessionDealWith.generateSessionID(SessionDealWith.java:214)atcom.fr.web.core.ReportletDealWith.dealWithReportlet(ReportletDealWith.java:35)atcom.fr.web.core.ReportDispatcher.checkAppServerConfig(ReportDispatcher.java:1183)atcom.fr.web.core.ReportDispatcher.dealWithRequest(ReportDispatcher.java:285)atcom.fr.web.ReportServlet.doGet(ReportServlet.java:169)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:740)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:853)atweblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)atweblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)atweblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)atweblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)atweblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)atweblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)atweblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)atweblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)atweblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)atweblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)报错类:jaxrpc.jar。
3、报错3web盟敢势袂logic9部署WebReport工程时的报错:[FatalError]:-1:-1:Prematureend泠贾高框offile.Aug16,20112:49:55PMcom.fr.base.FRContextgetScheduleManagerWARNING:XML??????com.fr.web.ReportletException:XML??????atcom.fr.base.core.BaseCoreUtils.parseXML(UnknownSource)atcom.fr.base.core.BaseCoreUtils.parseXML(UnknownSource)atcom.fr.base.XMLFileManager.readInputStreamXML(UnknownSource)atcom.fr.base.FRContext.getScheduleManager(UnknownSource)atcom.fr.web.ReportServlet.init(UnknownSource)atweblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:278)
4、报错4weblogic10.0.3或weblogic10.3.1部署WebReport工程时的报错:java.lang.ClassCastException:com.sun.xml.stream.ZephyrParserFactorycannotbecasttojavax.xml.stream.XMLInputFactory报错类:fr-third-xx.jar
2. 报错原因
1、这一类报错是由于类重用导致即类冲突,因为FineReport使用了一些第三方的插件跟weblogic里面的插件相同,但是插件版本不同(不同版本间方法的个数与实现可能不同),相同的插件只会加载一个版本,而weblogic会优先加载weblogic自身的类,如果加载了weblogic中使用的版本,当报表端使用到该第三方插件时就可能会因为找不到某些类而报如上的错误。
3. 解决方案
1、解决的主要思想就是修改加载顺序,使之优先加载FineReport中的类,即使正确的jar包先于weblogic.jar加载,在%/WebReport%/WEB-INF文件夹下新建weblogic.xml配置文件,让服务器优先调用报表工程下的jar包,内容如下:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEweblogic-web-appPUBLIC"-//BEASystems,Inc.//DTDWebApplication8.1//EN""http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"><weblogic-web-app><container-descriptor><prefer-web-inf-classes>true</prefer-web-inf-classes></container-descriptor></weblogic-web-app>