2

几周以来,我一直在努力让 Jasper 报告正常工作。它在 Eclipse 中运行良好,来自 Jasper 网站的演示可以运行。它只是在我的 JBoss 中的 jsp 页面上不起作用。

我的 jsp 页面非常基础。它调用类中的方法。它肯定会达到这一点,因为我有输出诊断。当我调用任何 Jasper 方法时,它会出现以下错误:

java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.xml.JRXmlDigesterFactory

我到处都倾倒了jar文件。我什至把这组罐子倒在我的jre/lib/ext文件夹里。

  • 蜡染1.5
  • commons-beanutils-1.8.0
  • commons-collections-3.2.1
  • commons-digester-1.7
  • commons-javaflow-20060411
  • 公共日志记录-1.1.1
  • iText-2.1.7
  • jasperreports-4.6.0
  • jasperreports-applet-4.6.0
  • jasperreports-fonts-4.6.0
  • jasperreports-javaflow-4.6.0
  • 日志4j
  • org.eclipse.jdt.core_3.7.1.v_B76_R37x
  • poi-3.6

但没有任何区别。


感谢您的回复和建议。我求助于将 jars 转储到 jre/lib/ext 文件夹中,因为我已经在 J​​Boss default/lib 中尝试过使用它们,但它不起作用。但是,我现在已经删除了除了 Jboss 默认/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)

我可以提供任何可能帮助某人诊断我的问题的其他信息。有谁知道我在这里做错了什么?

4

2 回答 2

0

那么第一件事就是停止到处乱扔jar文件。通过这样做,您会使问题复杂化,并且您可能会遇到任何未来的类路径问题。请注意,我并不是要居高临下,当我在发布之前阅读它时听起来就是这样。遇到这样做的人,然后几个月或几年后排除其他问题,这只是我的一个小烦恼,他们使一切复杂化。

所以第 1 步是找出 jar 文件net.sf.jasperreports.engine.xml.JRXmlDigesterFactory在什么。如果它与 JasperReports 4.5 相同,那么它将在你里面jasperreports-4.6.0

第 2 步是找到放置 jar 文件的合适位置。根据我在这里找到的一些 JBoss 文档,它应该位于您的 JBoss 安装目录中server/default/lib。该文件夹的描述是:

lib 目录是不应热部署的静态 Java 库的默认位置。此目录中的所有 JAR 在启动时都加载到共享类路径中。

第 3 步是重新启动 JBoss 并确保它正常工作。

它现在应该可以工作,或者如果您缺少其他需要的库,您可能会收到不同的错误。如果是这样,请再次重复这些步骤。

最后第 4 步是花一点时间去清理所有你放的罐子。我知道本能是简单地离开它,或者甚至在适当的地方扔额外的罐子,因为你不知道你是否需要它们。相信我,它总有一天会咬你的。最好从一开始就保持一切整洁有序。

于 2012-06-18T17:32:46.210 回答
0

你混淆ClassNotFoundExceptionNoClassDefFoundError. 你的类路径已经很好了。请不要污染 JRE 库。你绝对应该撤销它。只需将 JAR 放入其中/WEB-INF/lib就足够了。不要忘记撤消在 Eclipse 项目的“构建路径”设置中所做的任何更改。

NoClassDefFoundError基本上意味着static所提到的类的变量或块之一在初始化期间引发了异常,这反过来又导致类加载器无法加载类。该异常的真正根本原因应该在堆栈跟踪中进一步可见。由于您没有发布整个堆栈跟踪,因此无法向您解释为什么它无法初始化以及如何解决它。

因此,请阅读堆栈跟踪中最底层的根本原因,解释异常/消息并相应地修复它。

于 2012-06-18T20:52:02.890 回答