私たちの 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 Report コンポーネントのないページで発生する可能性があります。Jasper Report Bean は、常にタグ lib を見つけようとしているよう
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 コンポーネントがないことを意味します) がアプリケーション内にあることです。この状況に対する解決策/答えはありますか?また、例外メッセージから、少なくとも 1 つの JAR が TLD に対してスキャンされましたが、TLD は含まれていませんでした。org.apache.jasper.compiler.JDTCompiler.generateClass (JDTCompiler.java:442) で
はTomcatから来るべきであり
Tomcat never contains any JSTL jar
、ジャスパーレポートを解析するための一致するTLDを見つけることができないため、すべてのjarファイルのフルスキャンを実行します。org.apache.commons.digester.Digester
もしそうなら、ジャスパー テンプレートの解析で実際に忙しいように見える大量のデバッグ ログがあるのはなぜですか?
一般に、このスレッドを作成して、問題の解決策を見つけようとするだけでなく、ジャスパーがそれを必要としない場所で非常にアクティブである理由と、Tomcat にテンプレートを適切に解析させる方法についての答えを見つけます。
冗長すぎる場合はお詫び申し上げます。また、ヒントをありがとうございます。