双击 .jar 文件时出现“找不到主类”的错误

30

首先:我认识到这个问题应该相当简单,很多人似乎都经历过。然而,我的问题似乎与现有的帖子稍有不同。

我正在使用NetBeans编译Java应用程序。建立完成后,输出会正确地进入dist\文件夹。jar文件也在那里。如果我进入命令行,导航到该文件夹,然后调用以下内容:

java -jar Prosperity.jar

一切都运行正常。显然应用程序的名称是Prosperity。下面的命令也可以正常工作:

javaw -jar Prosperity.jar

然而,双击.jar文件会显示消息:"找不到主类",然后给出.jar文件的路径。我已经检查了一百遍,确保META-INF文件夹存在于.jar文件中,并且其中存在一个具有正确的主类名称的MANIFEST.MF文件。我还检查了主类(App.class).class文件是否存在于.jar文件中。

所以问题是:双击文件和运行javaw有什么区别?它无法运行真的很令人沮丧!

感谢您能给我任何方向,我快要抓狂了!


2
似乎Java以某种方式认为我的主类实际上是我正在运行的jar文件的路径。不知道它是如何想到的。它似乎忽略了清单中的值,并寻找一个名为C:\Users\MyUser\MyApp\Prosperity.jar的主类。我假设如果我能弄清楚它是如何成为正在寻找的主类的名称,那么我就可以解决这个问题。 - aardvarkk
6个回答

25

也许你的文件关联出了问题。在命令提示符下,尝试运行

ftype | find "jarfile"

在我的64位Windows 7电脑上,显示如下:

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

您也可以使用 ftype 进行更改:

ftype jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

1
这就是解决问题的方法。为了真正让事情动起来,我下载了一个叫做unassoc的程序,其目的是删除所有文件关联的痕迹。值得注意的是,我的应用程序安装正在进行静默安装JRE,这会导致(当然是静默的!)无法正确关联.jar文件。因此,我不得不更改主程序安装方式,不再进行静默安装,并清理我的文件关联。重新安装JRE后,我可以通过双击它来执行.jar文件。只希望我知道文件关联在出现问题时看起来是什么样子... - aardvarkk
1
根据"It seems that somehow Java is getting the idea that my main class is actually named the PATH",我认为发生的事情是%1周围没有引号,并且jar文件位于包含空格的路径中。 - Fredrik
谢谢你们两个的帮助!那真是一场噩梦。当简单的事情出错时,我真的很讨厌它... - aardvarkk
这很奇怪,因为我遇到了同样的问题,但是它取决于我生成jar的方式。在Eclipse中,可运行的jar可以正常工作,而使用fat-jar插件时,我遇到了相同的问题。此外,几乎每个其他用户都有这个问题,如果我打包我的应用程序,潜在用户将不知道如何更改文件关联吗?您认为删除文件关联是这个问题的唯一原因吗? - Johnydep
从我所看到的情况来看,当您在构建路径中有额外的引用库需要包含在您正在导出的jar文件中时,问题就会出现。否则,单个jar文件可以正常工作,我相信这不仅仅是文件关联的问题。 - Johnydep
显示剩余3条评论

11

刚发现这篇文章...

如果只有在双击jar文件时出现问题而在命令行启动时没有问题,则可能是JRE的版本错误(6代替7)。

只需更改regedit中的值:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jarfile\shell\open\command] "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

为:

"C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %*

如果更新此值,则不应该出现任何问题。


注意:在Windows上在32位和64位版本之间进行切换:

-> "C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %* 将使用JRE的64位版本 -> "C:\Program Files (x86)\Java\jre7\bin\javaw.exe" -jar "%1" %* 将使用JRE的32位版本


1
我也遇到了这个错误。我使用命令提示符检查了文件关联,一切都正确。直到我尝试使用命令行运行“.jar”文件“java -jar MyProgram.jar”时,它才真正显示了问题所在。
结果发现,“.jar”是在JDK 7下编译的,而我只在运行JRE 6。这是提示给我的错误,导致我找到了真正的解决方案:
Exception in thread "main" java.lang.UnsupportedClassVersionError: MyProgram/Program : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: MyProgram.Program. Program will ex
it.

1

搜索您的注册表并检查以下项目

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command]
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\""


[HKEY_CLASSES_ROOT\jarfile\shell\open\command]
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\""


[HKEY_CURRENT_USER\Software\Classes\Applications\javaw.exe\shell\open\command]
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\""

0

我刚遇到了完全相同的问题,用同样的方法解决了。我不得不完全删除关联,而不仅仅是用户自定义,并重新安装JRE。

修复前的关联仍然是:

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

然后(同上):

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

3
抱歉,那是想留言。 - James

0
如果上述方法无法解决问题,请尝试从您的计算机中删除.jar文件类型(您可以在谷歌上查找一个名为Unassoc.exe的软件并删除该文件类型),然后问题就可以解决了!(至少,在我的情况下是这样!)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接