Ubuntu 18.04下Java Artifact生成失败,运行Jar提示主类未找到求助
解决Jar文件提示“主类未找到或未加载”的问题
我太懂这种明明代码写得没问题,打包成Jar就报错的烦躁感了!咱们一步步排查,把问题揪出来:
1. 先检查Manifest文件的格式——这里最容易踩坑
Manifest文件的格式要求特别严格,你现在的内容是把两行写在一行了,而且最后必须加一个空行,否则JVM读的时候会出问题。正确的格式应该是这样:
Manifest-Version: 1.0 Main-Class: Main
注意:Main-Class:后面必须跟一个空格,最后一行要空着,别省这个步骤!
2. 确认编译后的class文件位置,打包时别搞错路径
你说Manifest在src文件夹里,但打包Jar的时候,要包含的是编译好的.class文件,不是.java源文件。给你一套标准的操作步骤:
- 先编译源文件:
javac src/Main.java,这会在src目录下生成Main.class - 把Manifest文件放到和class同目录(或者保持在src,但打包时要指定正确路径)
- 执行打包命令:
不过更稳妥的是把class文件移到根目录,这样打包时主类路径就是jar cvfm myapp.jar src/manifest.txt src/Main.classMain,不会出问题:mv src/Main.class . jar cvfm myapp.jar src/manifest.txt Main.class
3. 验证Java环境变量是否真的生效
虽然你配置了/etc/environment和/etc/profile,但有时候终端没加载最新的配置。先在终端里运行这两个命令看看:
echo $JAVA_HOME echo $PATH
如果输出里没有/usr/lib/jvm/java-8-oracle或者$JAVA_HOME/bin,就运行source /etc/profile刷新一下,或者重启终端再试。
4. 看看Jar包里面到底装了啥
打包完之后,用这个命令查看Jar的内容:
jar tf myapp.jar
正常的输出应该包含这几项:
META-INF/ META-INF/MANIFEST.MF Main.class
如果看不到Main.class,说明打包时没把它加进去;如果Manifest的路径不对,也要调整打包命令。
5. 先跳过Jar,直接运行class文件排除问题
先别打包,直接运行编译好的class文件:
java Main
如果能正常输出Hello World!,说明你的代码和Java环境都是好的,问题肯定出在打包环节;如果这一步也报错,那就要检查环境变量或者编译是否正确了。
按上面的步骤排查下来,大概率能解决问题——我遇到过好多次都是Manifest格式或者打包路径的问题,仔细核对一下就行!
内容的提问来源于stack exchange,提问作者muelleste
相关产品推荐
相关产品推荐

