tomcat - Grails 2.5.0 在部署到 tomcat 时不使用我的 lib/jars

标签 tomcat grails

我不得不编译渲染插件使用的飞碟 jar 的自定义版本,以解决渲染和引导 css 的问题。它在本地运行良好...我可以将 gsp 渲染为 PDF。如果我不在 lib 目录中包含我的自定义 jar,我会收到以下错误:

com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I. Stacktrace follows:
org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Executing action [invoiceAll] of controller [myapp.ReportsController]  caused exception: Runtime error executing action
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
    at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Runtime error executing action
    ... 8 more
Caused by: java.lang.reflect.InvocationTargetException
    ... 8 more
Caused by: java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
    at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.setMetricDefaults(ITextFontResolver.java:679)
    at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.<init>(ITextFontResolver.java:610)
    at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:410)
    at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:390)
    at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:52)
    at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:115)
    at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:102)
    at grails.plugin.rendering.pdf.PdfRenderingService.doRender(PdfRenderingService.groovy:34)
    at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:43)
    at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:37)
    at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:35)
    at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:65)
    at RenderingGrailsPlugin$_closure3.doCall(RenderingGrailsPlugin.groovy:59)
    at myapp.ReportsController.invoiceAll(ReportsController.groovy:46)
    ... 8 more

因此,在本地执行此操作效果很好。 lsof 显示我的 jars 正在被 grails java 进程使用:

java    26951 myuser  mem    REG             253,14    105122  531524 /home/myuser/sworkspace/groovy/tls_billing/lib/flying-saucer-pdf-9.0.1-myapp.jar
java    26951 myuser  mem    REG             253,14   1106329  528159 /home/myuser/sworkspace/groovy/tls_billing/lib/flying-saucer-core-9.0.1-myapp.jar
java    26951 myuser  mem    REG             253,14    105172  531525 /home/myuser/sworkspace/groovy/tls_billing/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java    26951 myuser   68r   REG             253,14    105172  531525 /home/myuser/sworkspace/groovy/tls_billing/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java    26951 myuser   69r   REG             253,14   1106329  528159 /home/myuser/sworkspace/groovy/tls_billing/lib/flying-saucer-core-9.0.1-myapp.jar
java    26951 myuser   75r   REG             253,14    105122  531524 /home/myuser/sworkspace/groovy/tls_billing/lib/flying-saucer-pdf-9.0.1-myapp.jar

为了安全起见,我还在本地对 jar 进行了 sha1sum:

2c135a987892978d670cd73e789fa3337d50e7ff  lib/flying-saucer-core-9.0.1-myapp.jar
b774052563a12fc212370a1c1a8a71ea5b8c0e87  lib/flying-saucer-pdf-9.0.1-myapp.jar
64c01c5f3425b0723b0d2e4a034fe9f23e3e1720  lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar

因此,在“grails war”然后部署到远程 Tomcat 服务器后,我收到以下错误:

2015-07-15 16:56:20,221 [http-bio-80-exec-1] ERROR StackTrace  - Full Stack Trace:
java.lang.reflect.InvocationTargetException
        at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
        at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
        at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
        at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
        at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
        at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.setMetricDefaults(ITextFontResolver.java:679)
        at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.<init>(ITextFontResolver.java:610)
        at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:410)
        at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:390)
        at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:52)
        at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:115)
        at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:102)
        at grails.plugin.rendering.pdf.PdfRenderingService.doRender(PdfRenderingService.groovy:34)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:43)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:37)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:35)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:65)
        at RenderingGrailsPlugin$_closure3.doCall(RenderingGrailsPlugin.groovy:59)
        at myapp.ReportsController.invoiceAll(ReportsController.groovy:46)
        ... 8 more
2015-07-15 16:56:20,221 [http-bio-80-exec-1] ERROR StackTrace  - Full Stack Trace:
java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
        at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.setMetricDefaults(ITextFontResolver.java:679)
        at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.<init>(ITextFontResolver.java:610)
        at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:410)
        at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:390)
        at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:52)
        at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:115)
        at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:102)
        at grails.plugin.rendering.pdf.PdfRenderingService.doRender(PdfRenderingService.groovy:34)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:43)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:37)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:35)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:65)
        at RenderingGrailsPlugin$_closure3.doCall(RenderingGrailsPlugin.groovy:59)
        at myapp.ReportsController.invoiceAll(ReportsController.groovy:46)
        at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
        at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
        at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
        at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
        at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
2015-07-15 16:56:20,221 [http-bio-80-exec-1] ERROR StackTrace  - Full Stack Trace:
org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Executing action [invoiceAll] of controller [myapp.ReportsController]  caused exception: Runtime error executing action
        at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
        at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
        at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
        at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
        at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Runtime error executing action
        ... 8 more
Caused by: java.lang.reflect.InvocationTargetException
        ... 8 more
Caused by: java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
        at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.setMetricDefaults(ITextFontResolver.java:679)
        at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.<init>(ITextFontResolver.java:610)
        at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:410)
        at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:390)
        at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:52)
        at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:115)
        at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:102)
        at grails.plugin.rendering.pdf.PdfRenderingService.doRender(PdfRenderingService.groovy:34)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:43)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:37)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:35)
        at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:65)
        at RenderingGrailsPlugin$_closure3.doCall(RenderingGrailsPlugin.groovy:59)
        at myapp.ReportsController.invoiceAll(ReportsController.groovy:46)
        ... 8 more

为了确定,我进入/opt/tomcat/webapps/ROOT/WEB-INF/lib(部署我的应用程序的位置)并运行:

$ sha1sum flying-saucer-*
2c135a987892978d670cd73e789fa3337d50e7ff  flying-saucer-core-9.0.1-myapp.jar
b774052563a12fc212370a1c1a8a71ea5b8c0e87  flying-saucer-pdf-9.0.1-myapp.jar
64c01c5f3425b0723b0d2e4a034fe9f23e3e1720  flying-saucer-pdf-itext5-9.0.1-myapp.jar

匹配。但是,应用程序实际上是否持有对 jars 打开的文件句柄?

起初,在我有一段时间没有加载 URL 之后,它似乎不是:

$ sudo lsof | grep flying | wc -l 
0

我假设 Tomcat 会降低线程速度,因为在再次访问使用 jar(并导致异常)的 URL 后,我得到了点击:

$ sudo lsof | grep flying

F/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java      24487 24542        root  mem       REG              254,0  1106329     268857 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-core-9.0.1-myapp.jar
java      24487 24542        root  mem       REG              254,0   105122     268824 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-9.0.1-myapp.jar
java      24487 24542        root   93r      REG              254,0  1106329     268857 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-core-9.0.1-myapp.jar
java      24487 24542        root   94r      REG              254,0   105122     268824 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-9.0.1-myapp.jar
java      24487 24542        root   95r      REG              254,0   105172     268734 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java      24487 24559        root  mem       REG              254,0   105172     268734 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java      24487 24559        root  mem       REG              254,0  1106329     268857 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-core-9.0.1-myapp.jar
java      24487 24559        root  mem       REG              254,0   105122     268824 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-9.0.1-myapp.jar
java      24487 24559        root   93r      REG              254,0  1106329     268857 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-core-9.0.1-myapp.jar
java      24487 24559        root   94r      REG              254,0   105122     268824 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-9.0.1-myapp.jar
java      24487 24559        root   95r      REG              254,0   105172     268734 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java      24487 24629        root  mem       REG              254,0   105172     268734 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
java      24487 24629        root  mem       REG              254,0  1106329     268857 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-core-9.0.1-myapp.jar
java      24487 24629        root  mem       REG              254,0   105122     268824 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-9.0.1-myapp.jar
java      24487 24629        root   93r      REG              254,0  1106329     268857 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-core-9.0.1-myapp.jar
java      24487 24629        root   94r      REG              254,0   105122     268824 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-9.0.1-myapp.jar
java      24487 24629        root   95r      REG              254,0   105172     268734 /opt/apache-tomcat-7.0.61/webapps/ROOT/WEB-INF/lib/flying-saucer-pdf-itext5-9.0.1-myapp.jar
...snip...

$ lsof | grep flyingsaucer | wc -l
228

因此,jar 已加载,但应用程序仍然无法找到我自定义编译的包含缺少方法的 jar。

我在这里做错了什么?感谢您提供的任何帮助。

最佳答案

这看起来像是类路径冲突。启动 Tomcat 容器时,尝试将 -verbose 添加到您的 JVM 设置中:

export JAVA_OPTS="-verbose"

然后从输出检查 com.lowagie.text.pdf.BaseFont 是从哪个 JAR 加载的,并验证它是正确的。这将帮助您调试情况。

关于tomcat - Grails 2.5.0 在部署到 tomcat 时不使用我的 lib/jars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31441194/

相关文章:

grails - 将搜索/过滤器添加到脚手架 list.gsp

gradle 中的 Tomcat 依赖

java - Spring MVC 教程不工作

java - Tomcat 6.0 上的 SSL

java - Grails - 创建数据库 View

security - 在Grails中编辑我自己的用户页面

tomcat - 我可以从 Tomcat 上下文设置 JDBC 隔离级别吗?

java - Mongo DBCursor 在 Tomcat 和普通 Java 进程中的行为不同

grails - Grails 2.4.5 lib文件夹在哪里

java - Websocket HandshakeRequest 抛出 ClasscastException