【问题标题】:Can't find or load main class, in a .jar file在 .jar 文件中找不到或加载主类
【发布时间】:2018-11-01 04:09:28
【问题描述】:

一直在寻找大约 2 小时来解决我的问题,尝试了无数解决方案,但问题仍未解决。

我有一个包含几个包的游戏项目;几何、关卡、装饰和游戏。游戏包里面有一个gameRun.java

package game;
public class gameRun {

/**
 * Program entry point.
 * @param args the arguments for the levels
 */
public static void main(String args[]) {
    ... some code
}
}

我有以下清单文件:

Main-Class: game.gameRun
Class-Path: someExternalGraphicTool.jar
//newline here

我使用以下命令编译我的整个游戏:(bin 文件夹已经存在)。

  javac -d bin src/geometry/*.java src/decoration/*.java src/levels/*.java src/game/*.java

然后我使用以下命令将编译的类转换为可执行的 .jar 文件:

jar cvfm t.jar manifest.mf bin/geometry/*.class bin/decoration/*.class bin/levels/*.class bin/game/*.class 

然后我尝试使用以下命令运行我的 t.jar:

java -jar t.jar 
//or 
java -cp .:t.jar game.gameRun

两者都会产生错误,“错误:无法找到或加载主类game.gameRun” 但是,当我解压缩 jar 文件时,在 bin/game 目录中我可以看到一个 gameRun.class 文件,在 META-INF\MANIFEST.MF 文件中我仍然可以看到 Main-Class 设置为 game.gameRun。

请注意,我正在使用命令行的远程 linux 服务器上工作,即使我将 jar 文件下载到我的 windows 10 机器上,它也不起作用。

在这个过程中我做错了什么?感谢您的帮助。

【问题讨论】:

  • 如果你的班级被称为gameRun,那么你的清单应该是Main-Class: gameRun,我想。顺便说一句,Java 命名约定是类名总是以大写字母开头。你应该遵守约定。
  • gameRun 类在游戏包中,所以根据我的阅读,我应该输入 game.gameRun。我刚刚尝试按照您的建议制作 jar,但它产生了与 gameRun 而不是 game.gameRun 相同的错误。
  • 对不起...我以为你没有包裹。
  • 编辑了代码以显示它现在在一个包中。
  • 清单是您正在创建的东西还是自动创建的?是否可以包含整个清单?

标签: java jar manifest


【解决方案1】:

由于bin 文件夹,您的类在jar 文件中的结构错误。我的建议:将其全部打包到一个 jar 中,从 bin 文件夹开始。

现在,当您提取 jar 时,您将看到 2 个文件夹:META-INF 和 bin。

如果你从 bin 文件夹中制作 jar,你会看到:META-INF 和游戏,它会起作用。

它不适合你,因为它找不到主类,因为它在 bin/game/YourClass.class 中,而不是在 game/YourClass.class 中。

...\bin> jar cvfm t.jar manifest.mf geometry/*.class decoration/*.class levels/*.class game/*.class

然后就是:

...\bin> java -jar t.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 2021-06-06
    • 1970-01-01
    • 2013-03-23
    • 2012-10-13
    • 2019-07-21
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多