【问题标题】:Cannot get Jasper report to work with jsp/servlet无法让 Jasper 报告与 jsp/servlet 一起使用
【发布时间】:2012-06-18 15:56:33
【问题描述】:

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

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

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

我到处都倾倒了 jar 文件。我什至将这组 jar 包转储到我的 jre/lib/ext 文件夹中。

  • 蜡染1.5
  • commons-beanutils-1.8.0
  • commons-collections-3.2.1
  • commons-digester-1.7
  • commons-javaflow-20060411
  • commons-logging-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
  • log4j
  • 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)

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

【问题讨论】:

    标签: jsp servlets jasper-reports


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多