在使用Eclipse导出的jar文件运行时出现“找不到主类”错误

32

我有一个Java项目,在Eclipse内运行良好。但是当我尝试将其导出为"JAR文件""可运行的JAR文件"时,虽然生成了.jar文件,但当我双击它尝试运行程序时,它会给出一个错误提示:

"Could not find the main class: package.MainClassName. Program will exit."

如我所述,我尝试了导出为两个JAR选项,我指定了包含主方法的正确类,并且当我查看.jar文件中的实际文件时,一切似乎都井然有序 - manifest文件看起来像这样:

Manifest-Version: 1.0
Main-Class: package.MainClassName
(blank line)

并且在 META-INF 文件夹中。有一个带有我的包名称的文件夹,其中包含所有的 .class 文件,包括包含 main 方法的类。一些我使用的图像和文本文件也出现在 jar 文件中。

实际程序并不复杂——它是一个使用 Swing 制作的简单“贪吃蛇”游戏(当从 Eclipse 中运行时,所有代码都能正常工作)。

有什么想法可以解决这个错误,我该如何修复它?如果还需要其他信息,请告诉我。


主类的完全限定名称是什么?是 package.MainClassName 还是其他什么? - Jim Garrison
“Manifesto”是一种方便的方式,可以在原地检查您的清单。 - trashgod
1
@trashgod,Manifesto到底有什么作用,仅仅查看清单就不行吗? - scaevity
@scae:只是为了方便;它展示了 JAR 文件中实际出现的清单,而无需提取内容。 - trashgod
可能是重复的问题:"Could not find the main class" when double-clicking .jar file - Andrew Marshall
你在哪里查看清单? - user3388884
9个回答

27

确认您可以像这样启动应用程序:

java -cp myjarfile.jar snake.Controller
我刚刚读到 当我双击它时,这听起来像是您操作系统的配置问题。您是在Windows资源管理器窗口上双击文件吗?请尝试通过命令行/终端运行它。
java -jar myjarfile.jar

进一步阅读


清单文件必须以换行符结尾。请检查您的文件,缺少换行符可能会引起问题。


抱歉,我之前忘了提到,清单是由Eclipse创建的,并且在末尾包含一个空行(有时包含两个)。 - scaevity

8

在命令行中运行它的方法如下:

java -jar /path/to/your/jar/jarFile.jar

1
有人能解释一下这个答案哪里出了问题吗?我不明白。当我遇到“找不到主类错误”时,这正是我用来运行jar文件的方法。 - MobileMon
3
这对我有用,忘记在“jar”前面加“-”。 - Fish Biscuit

7

好的,我终于让它正常工作了。如果我使用JRE 6而不是7,一切都很顺利。不知道为什么,但它可以正常工作。


2
啊哈,出现了版本冲突,你的Eclipse使用的是比类路径上的更高的版本。这种情况经常发生。 - nIcE cOw
除了在Eclipse中使用旧版本之外,还有其他修复它的方法吗? - scaevity
在环境变量中选择 Eclipse 和 Path 变量的相同版本。 - nIcE cOw
1
在Eclipse中,进入您的项目的运行配置并选择“主类”(浏览并选择)。之后生成JAR文件。这应该解决任何问题。 - Rakesh

5

您是否尝试手动创建.jar文件而非使用Eclipse? 请尝试以下步骤,希望能有所帮助:

假设您的目录结构如下:

 TicTacToe(Your Project Name I mean)
 |              |                  |
src            bin             manifest.txt
             |    |
           icons  tictactoe

现在假设我的主类是包tictactoe中的BeginGame,因此我要在manifest.txt文件中写入以下内容:
Main-Class: tictactoe.BeginGame

请记得在冒号:和包名之间留一个空格,即tictactoe,在输入BeginGame后立即按下Enter键并保存文件。
现在打开命令提示符并进入bin文件夹所在的位置,以下是我的步骤说明:
C:\Mine\Eclipse\TicTacToe\bin>jar -cfm ..\tictactoe.jar ..\manifest.txt tictactoe icons
  • 第一个参数,即..\tictactoe.jar用于告诉程序在上一级目录中创建tictactoe.jar文件,也就是在TicTacToe文件夹的内部。
  • 第二个参数..\manifest.txt表示manifest.txt文件位于上一级目录,即在TicTacToe文件夹的内部。
  • 第三和第四个参数tictactoeicons表示将这两个文件夹添加到.jar文件中,因为它们位于bin文件夹中,所以直接使用。现在按Enter键。

现在尝试运行你在项目文件夹(在我的例子中是TicTacToe文件夹)内创建的.jar文件。

希望这次能成功。


1

您是否重命名了项目/主类(例如通过重构)?如果是,您的启动配置可能设置不正确(例如引用的主类或配置)。即使项目名称出现在“导出可运行jar”对话框中,仔细检查可能会发现不匹配的主类名称。

转到您的项目的“属性->运行/调试设置”,确保您的启动配置(与用于导出可运行jar的相同)设置为项目名称的正确名称您的主类设置为name.space.of.your.project/YouMainClass


1
我前几天遇到了同样的问题,花了好几天才解决。 错误信息是“找不到主类”,但我可以在其他Windows机器上运行从Eclipse导出的可执行jar文件而没有任何问题。
解决方案是安装相同版本的JRE的x64和x86版本。路径环境变量指向x64版本。不知道为什么,但对我有用。

0
对于遇到这个问题的NetBeans用户来说,解决方法非常简单:
1.进入您的项目,右键单击并选择“属性”。
2.点击“运行”,同时点击“浏览器”。
3.选择您想要首先出现的框架。

0

在项目上单击右键。 进入属性。 点击“运行/调试设置”。 现在删除您要运行的主类的运行配置。 现在,当您再次运行时,一切都将正常工作。


0

你只是缺少了 static 关键字,就这样。


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