如何执行简单JAR?解决Maven构建JAR依赖缺失报错问题
解决JAR运行时
NoClassDefFoundError的问题 你的问题核心是:生成的JAR包没有正确关联依赖项,导致运行时找不到Akka相关的类。下面分两种方案帮你解决,你可以根据需求选择:
方案一:修复现有依赖配置(保留分离的依赖库)
1. 调整Maven依赖插件的输出路径
你当前把依赖拷贝到了src/main/java/resources/lib,这个路径既不符合Maven标准目录结构,也和JAR manifest里指定的lib/路径不匹配(manifest里的lib/是相对于JAR文件的外部目录)。修改maven-dependency-plugin的配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </plugin>
这样依赖会被自动拷贝到target/lib目录,和你的JAR文件(target/distributed-1.0.0.jar)处于同一层级,完美匹配manifest的类路径配置。
2. 完善编译插件配置
你的maven-compiler-plugin没有指定Java版本,可能导致编译兼容性问题,补充上版本设置(根据你的实际Java版本调整,比如1.8):
<plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
3. 简化批处理脚本
现在不需要单独调用dependency:copy-dependencies,因为我们已经把它绑定到了package阶段,执行mvn package时会自动拷贝依赖:
call mvn clean package call cd target call java -jar distributed-1.0.0.jar pause
方案二:打包成包含所有依赖的Fat Jar(更简单)
如果不想单独管理依赖库,可以使用maven-shade-plugin直接把所有依赖打包到一个可执行JAR里,这样运行时不需要额外的lib目录:
1. 添加Shade插件到POM
替换原来的maven-jar-plugin(也可以保留,Shade会生成独立的包含依赖的JAR):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.ipca.distributed.Implementations</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
2. 修改批处理脚本
打包后会生成一个distributed-1.0.0-shaded.jar(你也可以在插件配置里自定义输出名称),直接运行这个JAR即可:
call mvn clean package call cd target call java -jar distributed-1.0.0-shaded.jar pause
为什么原来的配置会出错?
- 依赖被拷贝到了
src/main/java/resources/lib,这个目录会被打包到JAR内部,但Java默认不会从JAR内部的lib/路径加载依赖类。 - Manifest里的
classpathPrefix是lib/,它指向的是JAR文件外部的lib目录,而你的依赖并没有放在那里,所以运行时找不到类。
内容的提问来源于stack exchange,提问作者user11341081
相关产品推荐
相关产品推荐

