Maven项目打包后出现OpenCSV类未定义问题求助
解决Maven打包后缺失OpenCSV依赖导致的NoClassDefFoundError问题
问题核心
Maven默认的jar打包仅包含项目自身的编译代码,不会将第三方依赖(比如opencsv)合并到最终的jar文件中。运行打包后的jar时,JVM找不到opencsv的类文件,因此抛出NoClassDefFoundError/ClassNotFoundException。
解决方案:使用Maven Shade插件打包可执行Jar
通过配置maven-shade-plugin,可以将所有依赖的第三方库合并到最终Jar中,生成包含所有必要类的可执行文件。
修改你的pom.xml,添加以下build节点配置:
<project> <!-- 原有pom内容保持不变 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 替换为你项目中含main方法的类的全限定名 --> <mainClass>your.package.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
操作步骤
- 将配置中的
your.package.YourMainClass替换为项目实际包含main方法的类路径。 - 在IntelliJ终端执行命令:
mvn clean package - 打包完成后,
target目录会生成两个Jar:一个带original-前缀的原始Jar,另一个是合并了依赖的可执行Jar。运行不带前缀的Jar即可:java -jar target/Plugin-1.0-SNAPSHOT.jar
可选方案:Maven Assembly插件
若偏好使用assembly插件,可添加以下配置(同样需指定主类):
<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>your.package.YourMainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
打包后生成的Jar文件名会带有-jar-with-dependencies后缀,直接运行该文件即可。
内容的提问来源于stack exchange,提问作者Hexanilix
相关产品推荐
相关产品推荐

