.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
对话框中的第二个选项。
这是我的 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
对话框中的第二个选项。