运行Jar包时报java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRException如何解决
JasperReports打包JAR后ClassNotFoundException解决方案
核心原因
IDEA运行时会自动加载项目所有配置的依赖到类路径,打包为独立JAR运行时出现java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRException,本质是JAR包内未包含jasperreports的核心依赖类。
修复方案
如果你使用Maven构建项目
普通Java项目
配置maven-assembly-plugin插件,将所有依赖一并打入JAR:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>替换为你的主类全限定名,比如com.xxx.SchoolManagementApplication</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,使用生成的文件名带jar-with-dependencies后缀的JAR运行即可。
Spring Boot项目
直接使用官方spring-boot-maven-plugin即可,只需确认pom.xml中jasperreports的依赖scope未设置为provided:
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>你使用的版本号</version> <!-- 不要加<scope>provided</scope> --> </dependency>
如果你使用Gradle构建项目
普通Java项目
在build.gradle中添加如下配置,打包时包含所有依赖:
jar { manifest { attributes 'Main-Class': '替换为你的主类全限定名' } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
Spring Boot项目
直接使用bootJar任务打包即可,同样确认jasperreports依赖无provided scope。
额外检查项
- 若项目中用到.jasper/.jrxml模板文件,确保模板放在resources目录下,读取时使用类路径资源读取方式:
this.getClass().getResourceAsStream("/reports/你的模板文件名.jasper"),不要使用本地文件绝对路径。 - 如果你采用外置依赖目录的方式运行,需将所有jasperreports相关JAR放入依赖目录,启动时指定类路径:
java -cp "你的项目.jar:lib/*" 主类全限定名
内容的提问来源于stack exchange,提问作者Brunner Arthur
相关产品推荐
相关产品推荐

