我们的 Web 应用程序遇到一个复杂的情况
它是由 STS/ 开发的 Spring 应用程序Tomcat 7
。应用程序集成后Jasper report 4.6.0
,总是抛出 `OutOfMemoryError: PermGen Space. 然后让它工作的唯一方法是重新启动应用程序。但过了一会儿又发生了。这是异常之前的日志:
Oct 17, 2012 3:42:27 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Oct 17, 2012 3:42:30 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
这是异常中的一个部分,我在其中发现了一些内容Jasper
:
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:442)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:240)
at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:578)
at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:49)
at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:655)
以下是出现这种情况时的一些发现:
该问题可能发生在没有任何 Jasper 报告组件的页面上。Jasper Report bean 似乎一直在尝试查找标记库,而
a request is processed by the back end and responded to the front end
. 通常从日志文件中我可以看到,在所有后端操作(JPA 管理)完成之前,上述异常不会抛出在调试模式下运行 log4J 时,我看到大量信息显示诸如解析/渲染 Jasper 模板中的所有组件(文本字段、笔、框......),从巨大的日志中有一个小切口:
2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester.sax -- startElement(http://jasperreports.sourceforge.net/jasperreports,textElement,textElement) 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- Pushing body text '' 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- New match='jasperReport/summary/band/textField/textElement' 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- Fire begin() for FactoryCreateRule[className=net.sf.jasperreports.engine.xml.JRTextElementFactory, attributeName=null, creationFactory=net.sf.jasperreports.engine.xml.JRTextElementFactory@12dc6007] 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- [FactoryCreateRule]{jasperReport/summary/band/textField/textElement} New net.sf.jasperreports.engine.design.JRDesignTextField 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester.sax -- ignorableWhitespace()
尽管如此,当对不包含任何 Jasper 组件的页面的请求时,仍会生成此日志。
我做了一些研究,但仍然找不到解决这个问题的方法。
第一个问题是即使
jasperreport bean
在应用程序中也有一个问题,为什么当它甚至没有与当前服务自动装配时它总是在运行(意味着当前页面没有任何 jasper 组件)。这种情况有解决方案/答案吗?同样来自异常消息 扫描了至少一个 JAR 以查找 TLD,但未包含 TLD。在 org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:442)
应该来自 Tomcat,并且
Tomcat never contains any JSTL jar
,然后我假设它找不到匹配的 TLD 来解析 jasper 报告,因此对所有 jar 进行全面扫描。如果是这样,那么为什么有大量的调试日志org.apache.commons.digester.Digester
实际上似乎忙于解析 jasper 模板?
一般来说,做这个线程只是试图找出解决问题的方法,同时也找到为什么Jasper在一个不需要它的地方如此活跃的答案,以及我们如何让tomcat正确解析模板?
如果过于冗长,请道歉,并感谢您的任何提示。