如何解决子模块ear上提供的Maven依赖抛出ClassNotFoundException
环境:
- Java 11
- JBoss 7.2
- Maven 3.5
当我尝试从 app-commons 模块中的类执行方法时,我收到此错误 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(提供)
- app-commons
- jasperreports(编译) ...
pom.xml (app-commons)
<?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 (app-commons)
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)
- 出现
- jasperreports(编译)从 APP-COMMONS 移出
- 应用返回
- app-commons(提供)
- 应用前端
- app-commons(提供)
- app-commons ...
我无法将 app-commons 依赖项更改为已编译,因为它依赖于 app-front 和 app-back。在编译的 app-commons 中,我有一个 @ApplicationScope 类,由于 jakartaee 上下文管理,它会产生指向 app-commons 中的类的模糊 Bean。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。