打包Fat Jar后执行java -cp命令无法找到主类的问题求助
别慌,我来帮你排查几个最常见的问题:
1. Jar包的目录结构不符合Java包规范
你说打开Jar能看到class文件,但得确认它的位置是否正确。Java要求类文件必须放在和包名完全对应的层级目录里——也就是说,MyClass.class必须在Jar里的com/me/子目录下,而不是直接放在Jar的根目录。
举个正确的Jar结构例子:
my-jar.jar └── com └── me └── MyClass.class
如果你的Jar里是直接把MyClass.class丢在根目录,那Java虚拟机根本找不到com.me.MyClass这个全类名对应的文件。
2. 打包时的路径选择错误
大概率是你打包时没选对根目录。假设编译后你的MyClass.class在本地的./classes/com/me/目录下,那打包时应该先进入classes目录,再执行打包命令:
jar cvf my-jar.jar com
如果直接在项目根目录执行jar cvf my-jar.jar classes/com/me/MyClass.class,那Jar里的目录结构会变成classes/com/me/MyClass.class,这完全不符合包结构要求,Java自然找不到目标类。
3. 编译时的输出目录配置错误
再检查下编译过程:如果用javac编译时没指定输出目录,或者输出目录不对,会导致class文件没有生成在正确的包目录里。正确的编译命令应该用-d参数指定输出目录,确保包结构自动生成:
javac -d ./classes com/me/MyClass.java
这样编译后,classes目录下就会自动生成com/me/MyClass.class的层级结构,再基于这个目录打包就不会出错了。
最后教你个快速验证的方法:用jar tf my-jar.jar命令列出Jar里的所有文件,看看com/me/MyClass.class是否存在,这能立刻确认目录结构是否正确。
内容的提问来源于stack exchange,提问作者JGleason

