Maven构建jar包后执行报错:无法找到或加载指定主类
解决Maven Assembly打包后找不到主类的问题
别着急,这种情况我遇到过好多次,大概率是你的maven-assembly-plugin配置里,主类的manifest信息没正确配置或者生效——哪怕你核对了类名包名,插件也可能没把主类信息写入到jar的核心配置文件里。咱们一步步来排查修复:
1. 补全并检查assembly插件的完整配置
你提供的pom片段看起来没写完,确保插件配置包含以下关键部分,尤其是主类和执行阶段的设置:
<plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <!-- 建议指定稳定版本,避免默认版本的兼容性坑 --> <version>3.5.1</version> <configuration> <archive> <manifest> <!-- 这里必须填写完整的主类全限定名,注意大小写! --> <mainClass>com.atlassian.JiraRestCaller</mainClass> </manifest> </archive> <!-- 指定打包带所有依赖的jar --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <!-- 让插件在package阶段自动执行打包 --> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins>
这里要注意几个细节:
- 一定要指定插件版本,不同版本的配置可能有差异
<mainClass>的类名必须和你实际的主类完全一致(Java是大小写敏感的,别写错字母)- 配置
<executions>是为了让Maven在执行mvn package时自动触发打包,不然你手动运行mvn assembly:single可能会遗漏配置
2. 验证打包后的jar是否包含正确的主类信息
打包完成后,用命令查看jar里的MANIFEST.MF文件,确认主类信息是否存在:
unzip -p your-snapshot-jar-with-dependencies.jar META-INF/MANIFEST.MF
如果输出里有Main-Class: com.atlassian.JiraRestCaller这一行,说明配置生效了;如果没有,那就是插件配置有问题,回头再检查xml的语法(比如标签是否闭合)。
3. 确认主类的class文件确实在jar里
有时候可能主类没被正确编译打包,用下面的命令检查jar里的目录结构:
jar tf your-snapshot-jar-with-dependencies.jar | grep JiraRestCaller.class
正常应该输出com/atlassian/JiraRestCaller.class,如果没有,说明你的主类不在Maven默认的src/main/java目录下,需要调整pom里的sourceDirectory配置,或者把主类移到正确的源码目录。
4. 重新清理打包并测试
先清理之前的构建产物,再重新打包:
mvn clean package
然后到target目录下运行你的jar:
java -jar target/your-snapshot-jar-with-dependencies.jar
按照这个流程走下来,基本就能解决找不到主类的问题啦。
内容的提问来源于stack exchange,提问作者Fat Owl
相关产品推荐
相关产品推荐

