Возможно ли использование JasperReports в параллельных приложениях в одном и том же экземпляре TomEE (JasperReports Context)? - PullRequest
0 голосов
/ 08 января 2020

у нас странное поведение на только что загруженном сервере приложений TomEE. Наша ситуация: у нас работают два приложения (назовем его v1 и v2 ), которые предоставляют нам некоторые PDF-файлы с помощью REST API, использующего JasperReports. Когда мы выпустили v1, все работало нормально.

Когда мы обновили некоторый внутренний код и выпустили его как v2, начался хаос ... (Изменения в нашем коде едва не являются источником нашей проблемы, это только расчет изменений).

Наш хаос состоит в том, что когда мы сначала обращаемся к нашему коду в v1, наши Отчеты прекрасно обеспечиваются API v1. Когда мы пытаемся получить наш новый отчет из API v2, мы сталкиваемся с классом, а не Found Exception.

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)

Мы уже думали об отсутствующих зависимостях или об отсутствующих библиотеках, но: когда мы сначала обращаемся к API v2, мы получаем ту же ошибку в нашем v1 API.

Таким образом, кажется, что API-приложение, которое вызывается первым, «связывает» JasperStuff и d ie, другие API не могут получить к нему доступ. На самом деле мы закончили с нашими знаниями, и мы надеемся, что сможем получить некоторую помощь здесь.

Небольшая справочная информация: мы используем базовый пакет, который обеспечивает некоторые основные функции, такие как DB-Access и JDNI Resources, CORS Filter и Security Интерфейсы. Я не думаю, что основной пакет (предоставляемый в каждой войне отдельно) вызывает некоторый хаос, но из-за того, что у нас есть, помимо прочего, 2 ресурса JDNI с одним и тем же именем (но в различных приложениях и так в другом контексте), я думаю Мне нужно оставить эту информацию здесь.

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 09 января 2020

Итак, немного потрудившись и попробовав разные способы решения проблемы, мы наконец нашли рабочее решение: мы включили наши библиотеки JasperReports (и необходимые зависимости) в свойство tomcats common.loader.

Эффект , что у нас нет совпадающих библиотек JasperReports (хотя они той же версии). Меня немного смущает, что это должно быть причиной, но это приносит нам ожидаемый результат. Намек на это был AsyncFileHandlerWriter и «ощущение», что первый использованный контекст мог нормально работать с библиотеками JasperReports. Это было похоже на параллелизм контекста, но, честно говоря, мы не уверены, является ли это правильным решением или просто обходным решением для лежащей в основе проблемы.

Если у кого-то есть дополнительные подсказки, мы ценим каждый намек! Заранее спасибо.

...