Maven打包可执行Jar报错:无法初始化主类,如何修复?
问题原因
你用maven-jar-plugin生成的Jar包仅包含项目自身的编译代码,未打包依赖的第三方库(比如selenium-java),运行时JVM找不到这些依赖类,因此抛出NoClassDefFoundError。而Eclipse导出的可执行Jar默认会将依赖包一并打包,所以能正常运行。
解决方案
以下两种方法均可生成包含所有依赖的可执行Jar:
方法一:使用maven-assembly-plugin
在pom.xml的<plugins>节点中添加该插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>main.MyClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
执行Maven命令打包:
mvn clean package
打包完成后,target目录会生成两个Jar:
- 原
myprojectname-0.1.0-SNAPSHOT.jar(仅含自身代码) myprojectname-0.1.0-SNAPSHOT-jar-with-dependencies.jar(包含所有依赖,可直接运行)
运行带依赖的Jar:
java -jar myprojectname-0.1.0-SNAPSHOT-jar-with-dependencies.jar
方法二:使用maven-shade-plugin(更灵活,适合复杂项目)
在pom.xml的<plugins>节点中添加该插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>main.MyClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
执行Maven命令打包:
mvn clean package
此时target目录下的myprojectname-0.1.0-SNAPSHOT.jar即为包含所有依赖的可执行Jar,直接运行即可:
java -jar myprojectname-0.1.0-SNAPSHOT.jar
注:你之前在
maven-jar-plugin中配置的<addClasspath>true</addClasspath>仅会在Manifest中添加依赖路径,并不会自动打包依赖包,需手动将依赖包放到指定路径(如Jar同目录的lib文件夹),这种方式不如上述两种方法便捷。
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

