在子模块 ear 上提供的 Maven 依赖项抛出 ClassNotFoundException
Maven dependency provided on submodule ear throws ClassNotFoundException
环境:
- Java11
- JBoss 7.2
- 行家 3.5
当我尝试从 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)
- app-ear
- 应用程序返回
- app-commons(已提供)
- 应用前端
- app-commons(已提供)
- 应用程序共享
- jasperreports(已编译)
...
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。
环境:
- Java11
- JBoss 7.2
- 行家 3.5
当我尝试从 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)
- app-ear
- 应用程序返回
- app-commons(已提供)
- 应用前端
- app-commons(已提供)
- 应用程序共享
- jasperreports(已编译) ...
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。