在子模块 ear 上提供的 Maven 依赖项抛出 ClassNotFoundException

Maven dependency provided on submodule ear throws ClassNotFoundException

环境:

当我尝试从 app-commons 模块中的 class 执行方法时,出现此错误 java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRException。编译了 app-commons 中的 Jasper 依赖,并提供了 app-back 中的 app-commons 依赖。

我该如何解决这个问题?

错误

09:29:24,013 SEVERE [org.primefaces.application.exceptionhandler.PrimeExceptionHandler] (default task-1) net/sf/jasperreports/engine/JRException: java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JRException
...
Caused by: java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRException from [Module "deployment.accfor2.ear" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
    ... 78 more

模块:

pom.xml(应用程序共享)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.name.app</groupId>
        <artifactId>app</artifactId>
        <version>8.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>app-commons</artifactId>
    <packaging>jar</packaging>
    <name>app-commons</name>
    ...
    <dependencies>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.15.0</version>
        </dependency>
    </dependencies>
    ...

ReportManager.java(应用程序共享)

public class ReportManager {

...
    public static void addParam(Map<String, Object> params, String nom, byte[] compiledReport) throws ReportException {
        try {
            params.put(nom, SerializationUtils.deserialize(compiledReport));
        } catch (Exception e) {
            throw new ReportException("Error deserialize compiledReport.");
        }
    }
...

pom.xml (app-back)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.name.app</groupId>
        <artifactId>app</artifactId>
        <version>8.0.0</version>
    </parent>

    <artifactId>app-back</artifactId>
    <packaging>war</packaging>
    <name>app-back</name>
    <description>Módul back (intranet)</description>

    <dependencies>
        ...
        <dependency>
            <groupId>com.name.app</groupId>
            <artifactId>app-commons</artifactId>
            <scope>provided</scope>
        </dependency>
     ...

ExecuteReportBean.java (app-back)

public class ExecuteReportBean.java
    ...
    public void compileReport(Informe informe, Map<String, Object> parametresSend) {

        ReportManager.compilaReport(parametre.getJasperReport());//ERROR java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRException
    ...

如果你将依赖声明为provided,它不会被打包到WAR。

要么将作用域更改为 compile,要么让应用程序服务器提供它(例如,将其放入 JBoss 模块)。

因为提供依赖时不包括传递依赖,所以我不得不以这种方式重构模块。

模块:

  • 应用程序(pom)
  • app-ear
    • jasperreports(已编译)从 APP-COMMONS 移动
  • 应用程序返回
    • app-commons(已提供)
  • 应用前端
    • app-commons(已提供)
  • 应用程序共享 ...

我无法将 app-commons 依赖项更改为已编译,因为它依赖于 app-front 和 app-back。在编译后的应用程序共享中,我有一个@ApplicationScope class,由于 jakartaee 上下文管理,它会产生指向应用程序共享中的 class 的模棱两可的 Bean。