.jar 文件错误 "could not find or load main class" 与 IntelliJ

.jar file error "could not find or load main class" with IntelliJ

这是我的 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 查看 .jar 文件时,我看到了这个:

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

Manifest-Version: 1.0
Main-Class: MainBot

META-INF 文件夹如下所示:

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

编辑:这是项目结构下的工件 |文物

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

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

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

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

SIGNINGGC.RSA
SIGNINGGC.SF

我假设您没有签署 Jar。然后,当您创建 Fat Jar 时,这些文件必须来自您的依赖项之一。如果您的任何依赖项有一个 Signed 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 完好无损,并 link 使用 Manifest 文件。

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