【问题标题】:JasperReports NoClassDefFoundError exception on net.sf.jasperreports.engine.util.JRStyledTextParserNet.sf.jasperreports.engine.util.JRStyledTextParser 上的 JasperReports NoClassDefFoundError 异常
【发布时间】:2010-09-02 14:51:35
【问题描述】:

尝试在 WebLogic 11g 上导出时,它会引发 NoClassDefFound 异常。我检查了应用程序 WAR 并且 jasperreports-3.7.4.jar 包含在 WEB-INF/lib 文件夹中。错误是什么?

堆栈跟踪

java.lang.NoClassDefFoundError: 网络/sf/jasperreports/engine/util/JRStyledTextParser 在 net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:181) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:76) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:86) 在 net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:56) 在 net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:142) 在 net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:78) 在 net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624) 在 org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.fillReport(AbstractJasperReportsView.java:676) 在

【问题讨论】:

  • 难道没有根本原因吗?在跟踪中进一步查看。类的初始化可能完全失败。
  • 网络应用或类路径中是否有多个 jasperreport jar。
  • @JoseK 似乎类路径上只存在一个 jar。我尝试在没有 Jasperreport.jar 的情况下部署此 WAR,但它在 Jasper 类上引发 NoClassDefFound 异常。
  • 它可能被缓存在 weblogic 域中的 tmp_delete 文件夹中 - 你可以删除所有这些并尝试吗?

标签: java jasper-reports


【解决方案1】:

终于,我让它工作了。我检测到了在 NoClassDefFoundError:net/sf/jasperreports/engine/util/JRStyledTextParser 之前抛出的根异常:

java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment

Unix 和 Linux 上的 Sun AWT 类依赖于 X Window 系统。当您使用这些类时,它们期望加载 X 客户端库并能够与 X 显示服务器通信。如果您的客户端有 GUI,这是有道理的;不幸的是,即使您的客户使用 AWT 但没有 GUI(我的情况是从 Web 应用程序生成报告),它也是必需的

绕过这个的方法是在系统启动时设置一个系统属性java.awt.headless=true

【讨论】:

  • 有没有人在不同的机器上使用 java.awt.headless=true 解决方案遇到问题?它在我们的一个部署中为我们工作,而在另一个部署中不起作用。两个部署都使用相同的 JVM 版本。
  • 对我有用!我的服务器是Weblogic 12c。我在服务器初始化参数中添加了-Djava.awt.headless=true 值,正好在服务器恢复选项卡中。
【解决方案2】:

我遇到了同样的问题,我们通过安装 xorg 字体包和 ttf 字体解决了这个问题。

【讨论】:

    【解决方案3】:

    文本解析异常意味着字体未被识别。我花了一整天的时间试图理解为什么,最后我使用文本 SansSerif 解决了这个问题。在 Linux 上只能解析少数字体。希望有所帮助, 最好的问候

    【讨论】:

      【解决方案4】:

      我们有类似的问题。我们通过使用 jasper java flow jar 文件解决了这个问题。

      java.awt.headless=true
      

      对我们不起作用。

      【讨论】:

      • 您能否分享一些关于您是如何实现这一目标的细节?我遇到了同样的问题,我尝试使用 java flow jar 但这对我也不起作用。有什么我想念的吗?
      • 这行到底需要在哪里添加?
      • @Elango 您需要将 java.awt.headless 属性设置为 true。这可以使用: static { System.setProperty("java.awt.headless", "true");或者,通过在你的 tomcat 启动命令中将 headless 属性设置为 -Djava.awt.headless=true
      【解决方案5】:

      如果没有足够的空间,你会得到同样的错误。我遇到了同样的错误,这是因为服务器硬盘上还有 0KB 的可用空间。

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,通过减少 /tmp 空间得到了解决。它是 100%(/tmp 文件夹)。我将它降低到 86% 并重新启动服务器,noclassdefinitionerror 消失了,问题得到解决。

        【讨论】:

          【解决方案7】:

          多次遇到这个问题,我已经找到了解决方案。 此错误是由于磁盘上的内存空间不足... 您可以尝试以下方法来解决: (i) 在 tmp 文件夹中留出足够的空间 (ii) 删除磁盘上一些不必要的文件以腾出一些空间。

          祝你好运..希望..它应该解决你的问题

          【讨论】:

          • 临时文件夹是什么意思
          【解决方案8】:

          一旦你遇到这个问题,谷歌搜索会将你带到这里。对我来说,问题是 Jdk 11.2。

          Caused by: java.lang.reflect.InvocationTargetException
                  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
                  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
                  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
                  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
                  at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84)
                  ... 85 more
          Caused by: java.lang.NullPointerException
                  at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
                  at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
                  at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
                  at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
                  at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
                  at java.base/java.security.AccessController.doPrivileged(Native Method)
                  at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
                  at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
                  at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
                  ... 90 more
          java.lang.InternalError: java.lang.reflect.InvocationTargetException
                  at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
                  at java.base/java.security.AccessController.doPrivileged(Native Method)
                  at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
                  at java.desktop/sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:189)
                  at java.desktop/sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:223)
                  at java.desktop/sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:251)
                  at java.desktop/sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:75)
                  at net.sf.jasperreports.engine.util.JRStyledTextParser.<clinit>(JRStyledTextParser.java:94)
                  at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:110)
                  at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:69)
                  at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:57)
                  at net.sf.jasperreports.engine.fill.JRFiller.createBandReportFiller(JRFiller.java:200)
                  at net.sf.jasperreports.engine.fill.JRFiller.createReportFiller(JRFiller.java:215)
                  at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:115)
                  at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:667)
          

          尝试过的解决方案

          • 使用 JDK 11.02 在本地运行。没问题。因为问题发生了 在 linux 64 系统上
          • 在服务器上运行 -Djava-awt.headeless=true as 一些用户建议。问题仍然存在。

          出现此问题的原因是已删除对某些字体的支持

          来自 Oracle 发行说明 https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#Removed

          从 Oracle JDK 中删除 Lucida 字体 Oracle JDK 不再提供 任何字体并且完全依赖于安装在操作系统上的字体 系统。

          这意味着 Bigelow & Holmes Lucida 系列中的字体(Lucida Sans、Lucida Bright 和 Lucida Typewriter)不再适用于 来自 JDK 的应用程序。

          如果应用程序依赖于 JDK 中提供的字体,它们可能需要 更新了。

          如果系统管理员正在运行依赖于 在 JDK 中提供的字体而不是系统字体包上,然后 应用程序可能无法运行,直到系统字体包 已安装。

          回到以前版本的 JDK 或者你可以尝试升级 Jasper。

          【讨论】:

            【解决方案9】:

            对于我来说,jasperreports 6.8.0,从版本更改项目依赖 xml-apis

                <dependency>
                        <groupId>xml-apis</groupId>
                        <artifactId>xml-apis</artifactId>
                        <version>2.0.2</version>
                </dependency>
            

                <dependency>
                        <groupId>xml-apis</groupId>
                        <artifactId>xml-apis</artifactId>
                        <version>1.4.01</version>
                </dependency>
            

            在 jaspersoft 社区论坛https://community.jaspersoft.com/questions/825173/could-not-initialize-class-netsfjasperreportsengineutiljrstyledtextparser 中提出的建议

            【讨论】:

              【解决方案10】:

              我必须在我的 alpine linux 中安装 xfce4 字体包。事实上,我正在使用 docker。所以,我在 dockerfile 中放了以下命令:

              RUN apk add xfce4
              

              【讨论】:

                【解决方案11】:

                这是由于缺少字体。我可以通过安装 fontconfig 和 urw-fonts 包来解决这个问题。

                yum install fontconfig
                yum install urw-fonts
                

                之后,您可以使用命令检查支持的字体

                fc-list
                

                如果仍未生成报告,您可能需要重新启动服务器。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-11-23
                  • 1970-01-01
                  • 2013-10-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多