我一直试图让Jasper报告连续数周工作。它在Eclipse中运行良好,来自Jasper网站的演示工作。它在JBoss的jsp页面中无法正常工作。
我的jsp页面非常基本。它调用类中的方法。它肯定达到了这一点,因为我有输出诊断。当我调用任何Jasper方法时,它会突然出现这个错误:
java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.xml.JRXmlDigesterFactory
我到处都丢弃了jar文件。我甚至在我的jre/lib/ext
文件夹中放弃了这组罐子。
但没有任何区别。
感谢您的回复和建议。 我在jre / lib / ext文件夹中使用了转储jar,因为我在JBoss default / lib中尝试过它们并且它不起作用。 但是,我现在已经删除了除Jboss default / lib之外的所有引用,但它仍然不起作用。
当我第一次启动JBoss并运行我的jsp页面时,我得到了这个堆栈跟踪:
2012-06-19 08:03:49,349 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/Kanban].[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at net.sf.jasperreports.engine.xml.JRXmlDigesterFactory.<clinit>(JRXmlDigesterFactory.java:179)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:207)
at my.test.TestClass.compileReport(TestClass.java:73)
at my.test.TestClass.show(TestClass.java:35)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
at java.lang.Thread.run(Thread.java:619)
这似乎表明错误是在org / apache / commons / logging / LogFactory中,但我肯定在JBoss default / lib中有commons-logging-1.1.1.jar。
如果我再次运行jsp页面,我会收到不同的错误:
2012-06-19 08:04:23,080 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/Kanban].[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.xml.JRXmlDigesterFactory
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:207)
at my.test.TestClass.compileReport(TestClass.java:73)
at my.test.TestClass.show(TestClass.java:35)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
at java.lang.Thread.run(Thread.java:619)
我可以提供任何可能有助于某人诊断我的问题的其他信息。有谁知道我在这里做错了什么?
答案 0 :(得分:0)
首先要停止在整个地方投掷jar文件。通过这样做,您将使问题复杂化,以及您可能遇到的任何未来的类路径问题。请注意我不是试图居高临下,当我在发布之前阅读它时听起来就是这样。这只是我的一个小小的烦恼,遇到这样做的人,然后几个月或几年后对其他事情进行故障排除,并使一切变得复杂。
因此,第1步确定了什么是jar文件net.sf.jasperreports.engine.xml.JRXmlDigesterFactory
。如果它与JasperReports 4.5相同,那么它将在你jasperreports-4.6.0
中。
第2步是找到放置jar文件的适当位置。根据一些JBoss文档,我发现here它应该位于server/default/lib
的JBoss安装目录中。该文件夹的说明是:
lib目录是静态Java库的默认位置 不应该热部署。加载此目录中的所有JAR 在启动时进入共享类路径。
第3步是重新启动JBoss并确保它正常工作。
它现在应该正常工作,或者如果您缺少其他所需的库,则可能会遇到其他错误。如果是这样,请再次重复这些步骤。
最后,第4步是花一点时间去清理所有放在那里的罐子。我知道本能只是简单地离开它,或者甚至在适当的地方扔掉额外的罐子,因为你不知道你是否需要它们。相信我有一天它会咬你。最好保持一切干净整洁。
答案 1 :(得分:0)
您将ClassNotFoundException
与NoClassDefFoundError
混淆。你的类路径已经很好了。请不要污染JRE库。你绝对应该撤消。将JAR放在/WEB-INF/lib
中就足够了。不要忘记撤消Eclipse项目的“构建路径”设置中所做的任何更改。
这个特殊的NoClassDefFoundError
基本上意味着所提到的类中的一个static
变量或块在初始化期间引发了异常,这反过来导致类加载器无法加载该类。应该在堆栈跟踪中进一步显示该异常的真正根本原因。由于您没有发布整个堆栈跟踪,因此无法解释为什么它无法初始化以及如何解决它。
因此,请阅读堆栈跟踪中最底层的根本原因,解释异常/消息并相应地修复它。