【问题标题】:.jar file error "could not find or load main class" with IntelliJ.jar 文件错误“无法找到或加载主类”与 IntelliJ
【发布时间】:2021-12-10 08:26:24
【问题描述】:

这是我的 MainBot.java 代码:

public class MainBot {
    public static void main(String[] args) {
        new MainBot("my_private_token");
    }

    public MainBot(String token) {
        // do stuff
    }
}

我遇到以下问题:当我尝试执行 IntelliJ 生成的 .jar 文件时,出现以下错误:

could not find or load main class: MainBot

但是当我使用 WinRAR 查看 in .jar 文件时,我看到了:

MainBot.class 文件就在那里! META-INF/ 文件夹中的清单文件如下所示:

Manifest-Version: 1.0
Main-Class: MainBot

META-INF 文件夹如下所示:

我做错了什么?导出时,我在 INTELLIJ 中选择正确的主文件,将 META-INF 目录添加到 resources/,然后构建我的工件。为什么找不到 MainBot 文件,当它在那里时?!我也尝试过使用 MAINFEST.MF 文件并尝试将 Main-Class 更改为 ../MainBot 或其他内容,但都没有奏效。

编辑:这是项目结构下的工件 |神器

【问题讨论】:

  • 能否在“项目结构|工件”下分享一个示例项目和工件配置?
  • @KonstantinAnnikov 我已经编辑了我的问题
  • 鉴于 module-info.class 的存在,您正在使用模块化项目,那么您不应该使用默认包。将MainBot 放入一个包中。
  • @MarkRotteveel 我做到了,现在说在package.MainBot 找不到主类。
  • 能分享一下MainBot代码吗?或者至少是类声明和主方法声明?

标签: java intellij-idea jar executable-jar intellij-14


【解决方案1】:

您生成的 Jar 中的 META-INF 文件夹有这两个文件 -

SIGNINGGC.RSA
SIGNINGGC.SF

我假设您没有在 Jar 上签名。然后,当您创建 Fat Jar 时,这些文件必须来自您的依赖项之一。如果您的任何依赖项具有签名 Jar,则可能导致 could not find or load main class: 异常。

您可以通过使用此命令(引用自here)删除这些文件并尝试运行代码来快速发现这是否是问题 -

zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*.DSA'

IntelliJ 在生成 Jar 时显示 2 个选项。第一个将生成一个 Fat Jar。另一个选项将保持其他库 jar 完整并使用清单文件与它们链接。

假设您只需要运行代码,请使用Create Jar from Modules 对话框中的第二个选项。

【讨论】:

  • 感激不尽!遗憾的是,zip 命令不起作用,但使用 WinRar 手动删除文件可以!
【解决方案2】:

我尝试在this tutorial 之后使用使用 gradle 的sample application 重现错误,但我做不到。示例应用程序有一个名为io.github.devatherock.example 的模块,其中包含module-info.java 文件和一个名为io.github.devatherock.example 的包,其中包含主类MainBot.java。我在 gradle 中将主类列为io.github.devatherock.example.MainBot,它会生成一个带有以下清单的 jar 文件:

Manifest-Version: 1.0
Main-Class: io.github.devatherock.example.MainBot

jar 执行没有任何错误。在 IDE 中,源代码的结构如下所示:

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2017-11-06
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多