java - 在同一 TomEE 实例上的并行应用程序中使用 JasperReports 是否不可能(JasperReports 上下文)?

标签 java tomcat jasper-reports noclassdeffounderror apache-tomee

我们在刚下载的 TomEE 应用服务器中出现了奇怪的行为。 我们的情况: 我们正在运行两个应用程序(我们称之为 v1v2),它们通过使用 JasperReports 的 REST API 为我们提供一些 pdf 文件。当我们发布 v1 时,一切都运行良好。

当我们更新了一些内部代码并将其发布为 v2 时,困惑开始了......(代码中的更改几乎不是问题的根源,这些只是计算更改。)

我们的困惑之处在于,当我们首先访问 v1 中的代码时,v1 API 可以很好地提供我们的报告。当我们尝试从 v2 API 获取新报告时,我们遇到了类 not Found 异常。

Exception in thread "AsyncFileHandlerWriter-2081853534" java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.extensions.ExtensionsEnvironment
    at net.sf.jasperreports.engine.DefaultJasperReportsContext.getExtensions(DefaultJasperReportsContext.java:277)
    at net.sf.jasperreports.engine.util.MessageUtil.getMessageProvider(MessageUtil.java:70)
    at net.sf.jasperreports.engine.JRRuntimeException.resolveMessage(JRRuntimeException.java:166)
    at net.sf.jasperreports.engine.JRRuntimeException.getMessage(JRRuntimeException.java:147)
    at net.sf.jasperreports.engine.JRRuntimeException.getMessage(JRRuntimeException.java:138)
    at java.base/java.lang.Throwable.getLocalizedMessage(Throwable.java:396)
    at java.base/java.lang.Throwable.toString(Throwable.java:485)
    at java.base/java.lang.String.valueOf(String.java:2801)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:135)
    at java.base/java.lang.Throwable.printEnclosedStackTrace(Throwable.java:699)
    at java.base/java.lang.Throwable.printEnclosedStackTrace(Throwable.java:713)
    at java.base/java.lang.Throwable.printStackTrace(Throwable.java:671)
    at java.base/java.lang.Throwable.printStackTrace(Throwable.java:725)
    at org.apache.juli.OneLineFormatter.format(OneLineFormatter.java:150)
    at org.apache.juli.FileHandler.publish(FileHandler.java:294)
    at org.apache.juli.AsyncFileHandler.publishInternal(AsyncFileHandler.java:146)
    at org.apache.juli.AsyncFileHandler$LogEntry.flush(AsyncFileHandler.java:185)
    at org.apache.juli.AsyncFileHandler$LoggerThread.run(AsyncFileHandler.java:161)

到目前为止,我们考虑过缺少依赖项或缺少库,但是: 当我们首先访问 v2 API 时,我们在 v1 API 中得到相同的错误。

所以看起来首先被调用的 API 应用程序“绑定(bind)”了 JasperStuff 并且其他 API 无法访问它。 我们实际上已经了解了我们的知识,希望我们能在这里得到一些帮助。

一点背景信息:我们使用一个核心包,它提供了一些核心功能,例如 DB-Access 和 JDNI 资源、CORS 过滤器和安全接口(interface)。我不认为核心包(在每次 war 中分别提供)会造成一些困惑,但由于事实上我们有 2 个同名的 JDNI 资源(但在不同的应用程序中,因此在不同的上下文中),我认为我需要将此信息留在这里。

预先感谢您的帮助。

最佳答案

因此,经过一番努力并尝试不同的方法来解决问题后,我们终于找到了一个可行的解决方案:我们将 JasperReports(以及必要的依赖)库包含到 tomcats common.loader 属性中。

结果是,我们没有一致的 JasperReports 库(尽管它们是相同的版本)。让我有点困惑的是,这应该是原因,但它给我们带来了预期的结果。 这样做的提示是 AsyncFileHandlerWriter 和第一个使用的上下文可以与 JasperReports 库一起正常工作的“感觉”。感觉有点像上下文并发,但说实话,我们不确定这是否是正确的解决方案,还是只是解决底层问题的解决方法。

如果有人有进一步的提示,我们感谢每一个提示!提前致谢。

关于java - 在同一 TomEE 实例上的并行应用程序中使用 JasperReports 是否不可能(JasperReports 上下文)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636106/

相关文章:

java - 按值对 Map<Key, Value> 进行排序

java - HQL 不返回结果,但生成的 SQL 在 SQL Developer 上完美运行

tomcat - Nginx + Tomcat 在同一台服务器上工作

java - 过滤器链 : java. 的 GlassFish 问题 lang.IllegalStateException: PWC3990: getWriter() 已为此响应调用

dependencies - JasperReports 的最小依赖项

java - 编译错误

jasper-reports - jasper 报告标题未打印在摘要页上

java - 两个代码的含义相同吗?

catalina.sh 中设置的 JAVA_OPTS 不适用于 TOMCAT 私有(private)实例

java - Flume Java自定义接收器和源