IntelliJ构建JAR后无法找到或加载主类问题求助
排查JAR运行找不到主类的可能原因
我来帮你梳理几个大概率导致这个问题的常见坑,都是IntelliJ打包JAR时容易忽略的细节:
清单文件
MANIFEST.MF的格式或内容错误
虽然你说填了清单信息,但要再仔细核对:Main-Class的全限定类名必须完全匹配,包括大小写(比如REFController不能写成RefController,包名continental也不能写错大小写);- 格式必须严格:
Main-Class: com.continental.ref.REFController,冒号后面必须有一个空格,且这一行不能有多余的空格、换行或特殊字符; - 检查清单文件末尾是否有多余的空行?有些情况下,空行可能导致JVM解析清单出错。
依赖提取导致的类路径冲突或覆盖
你选择了“将JAR文件提取到目标JAR”,如果某个依赖JAR里恰好也存在com.continental.ref.REFController.class(哪怕是不同版本),就会出现类覆盖的情况,JVM加载到的可能不是你自己的主类。可以打开JAR文件全局搜索这个类,看看是否存在多个副本。IntelliJ打包时的目录结构错误
确认你的REFController.class是否在JAR根目录的正确包路径下:必须是com/continental/ref/REFController.class,而不是嵌套在classes/、lib/或者其他子目录里。如果类文件被放到了子目录,JVM会找不到对应的类路径。命令行运行的环境干扰
- 试试换一种方式运行,直接指定主类和类路径:
d:\Own_Tools\REF_Standalone\build>java -cp REF_Standalone.jar com.continental.ref.REFController,如果能正常运行,说明问题出在清单文件上;如果还是报错,那大概率是JAR内部的类结构有问题。 - 检查是否设置了
CLASSPATH环境变量,这个变量会干扰JVM的类加载顺序,导致优先加载外部类而不是你JAR里的类。可以临时清空CLASSPATH再试。
- 试试换一种方式运行,直接指定主类和类路径:
Java模块化项目的特殊情况
如果你的项目用了Java模块(有module-info.java),那普通的Main-Class配置可能不够,需要在清单里添加Module-Main-Class,或者用模块化方式运行:java --module-path . -m 你的模块名/com.continental.ref.REFController。
内容的提问来源于stack exchange,提问作者Levente
相关产品推荐
相关产品推荐

