Maven Jar插件主类路径配置求助:可执行Jar启动报错
解决Maven构建Akka项目可执行Jar时找不到主类的问题
我来帮你搞定这个头疼的问题!当同时配置Maven Jar插件和Shade插件时,很容易因为主类路径写错、配置冲突或者插件配合不当导致Could not find or load main class报错,咱们一步步来调整:
1. 先确认主类的全限定名是否正确
这是最容易踩的坑!你的主类全限定名必须完全匹配,比如你的主类在包com.akka.demo下,类名叫AkkaApplication,那全限定名就是com.akka.demo.AkkaApplication——注意大小写(Java类名大小写敏感)、包名拼写,一个字母错了都不行。
2. 正确配置Maven Jar插件
Jar插件负责生成标准Jar包,要在archive的manifest里明确指定主类,配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <!-- 建议使用最新稳定版 --> <configuration> <archive> <manifest> <!-- 替换成你的主类全限定名 --> <mainClass>com.akka.demo.AkkaApplication</mainClass> <!-- 可选:自动添加依赖到Class-Path,方便运行非胖包时找到依赖 --> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin>
3. 同步配置Maven Shade插件(关键!)
因为你要生成包含所有依赖的可执行胖包,Shade插件的配置必须和Jar插件保持一致,还要处理Akka特有的配置文件冲突:
<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> <!-- 这里的主类必须和Jar插件的完全一致 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.akka.demo.AkkaApplication</mainClass> </transformer> <!-- Akka项目必备:合并所有依赖的reference.conf,避免配置覆盖 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>reference.conf</resource> </transformer> </transformers> <!-- 可选:给胖包加后缀,区分普通Jar和胖包 --> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>shaded</shadedClassifierName> </configuration> </execution> </executions> </plugin>
4. 正确运行生成的Jar包
执行mvn clean install后,你会在target目录下看到两个Jar:
- 普通Jar:比如
your-project-1.0-SNAPSHOT.jar——这个Jar不包含依赖,运行时需要手动指定类路径,不建议直接用java -jar运行 - 胖包Jar:比如
your-project-1.0-SNAPSHOT-shaded.jar——这是包含所有依赖和正确主类配置的可执行包,运行命令应该是:
java -jar target/your-project-1.0-SNAPSHOT-shaded.jar
5. 排查验证技巧
如果还是报错,你可以解压Jar包,查看META-INF/MANIFEST.MF文件:
- 确认里面有
Main-Class: com.akka.demo.AkkaApplication这一行,如果没有,说明插件配置没生效,检查pom.xml的插件是否在<build><plugins>标签内 - 检查Jar包内是否存在对应的类文件:比如
com/akka/demo/AkkaApplication.class,如果不存在,说明编译时主类没有被正确打包
内容的提问来源于stack exchange,提问作者Roma Jain
相关产品推荐
相关产品推荐

