无法使用 Jar 文件找到或加载主类

Posted

技术标签:

【中文标题】无法使用 Jar 文件找到或加载主类【英文标题】:Could not find or load main class with a Jar File 【发布时间】:2012-10-13 09:34:10 【问题描述】:

我正在尝试使用

@echo off
java -jar Test.jar
pause

随着清单的

Manifest-Version: 1.0
Main-Class: classes.TestClass

在Jar目录下,解压后可以清晰的看到一个classes\TestClass文件。

编辑:classes.TestClass 确实有一个public static void main(String[] args)

classes.TestClass 中的包减速是package classes;

但我仍然不断收到错误消息

Could not find or load main class classes.TestClass

我已经找到了解决这个问题的所有方法,但似乎没有任何帮助。

我尝试过编辑类路径、重做清单、安装新的 JRE。

我还应该做什么?

【问题讨论】:

TestClass是否包含main函数? @Baz 是的,它有一个 main 方法。 你确定TestClass的包名是classes吗? 是包类中的TestClass吗?我建议从命令行运行一次文件。如果成功则继续前进。 您将classes 输出目录与classes 包混淆了。 【参考方案1】:

如果您使用 Maven 项目进行设置——请确保以下内容与 pom.xml 文件中的 JDK 匹配。

<maven.compiler.source>17</maven.compiler.source>

<maven.compiler.target>17</maven.compiler.target>

在我的情况下,我将其设置为 14,而我的应用程序设置为 14——冲突导致我的 jar 文件出现找不到类的错误。

【讨论】:

【参考方案2】:

此错误消息的可能原因:

找不到或无法加载主类

当主类扩展(或实现)另一个不在类路径上的类(或接口)时。

【讨论】:

【参考方案3】:

通过 maven 打包时,有时可能会在 pom.xml 中的 &lt;build&gt; 标记下丢失以下行。因为 src 文件夹包含你的 java 文件

<sourceDirectory>src</sourceDirectory>

【讨论】:

【参考方案4】:

在 IntelliJ 中,尝试将 lib 文件夹从主项目文件夹添加到工件时出现此错误。

在 src 文件夹中放置和使用 lib 文件夹是可行的。

【讨论】:

【参考方案5】:

我收到此错误是因为我的主类在 test 包中,并且我正在使用 IntelliJ 创建工件。在创建工件时选中Include Tests框后,它得到了解决。

Screenshot from IntelliJ showing Include Tests checkbox

【讨论】:

【参考方案6】:

由于从 Microsoft Word 文档中复制和粘贴代码,我遇到了同样的问题。似乎使用了稍微不同类型的破折号- 字符,当我用正确的- 替换较长的破折号字符时,程序正确执行

【讨论】:

没错,我大部分时间都是在从 Outlook 或 Skype 复制时发生这种情况..【参考方案7】:

如果您使用包名称,则它不适用于包含点的文件夹 (Error: Could not find or load main class)。即使它成功编译并创建了 jar 文件。

相反,它需要一个完整的文件夹层次结构。

失败:

com.example.mypackage/
    Main.java

作品:

com/
    example/
        mypackage/
            Main.java

在 Linux 中编译:

javac `find com/ -name '*.java'` \ && jar cfe app.jar com.example.mypackage.Main `find com/ -name '*.class'`

【讨论】:

【参考方案8】:

我遇到此错误是因为我通过 IntellijIDEA 将 JAR 文件从库中提取到目标 JAR。当我选择另一个选项“复制到输出目录...”时,它解决了问题。希望对你有帮助

【讨论】:

没有帮助。【参考方案9】:

即使你在 jar 单词前错误地漏掉了“-”也会出现这个错误

错误的命令 java jar test.jar

正确的命令 java -jar test.jar

【讨论】:

【参考方案10】:

我知道这是一个老问题,但我最近遇到了这个问题,没有一个答案对我有帮助。然而,Corral 对 Ryan Atkinson 的回答的评论确实提示了我这个问题。

我在target/classes 中有所有编译的类文件,在我的情况下它们不是包。我试图用我项目的根目录中的jar cvfe App.jar target/classes App 打包它,因为我的 App 类位于默认的未命名包中。

这不起作用,因为新创建的App.jar 将在目录target/classes 中有App.class 类。如果你尝试用java -jar App.jar 运行这个jar,它会抱怨找不到App 类。这是因为App.jar 中的包与项目中的实际包不匹配。

这可以通过使用jar cvfe App.jar . App 直接从target/classes 目录创建jar 来解决。这在我看来是相当麻烦的。

简单的解决方案是使用-C 选项列出您要添加的文件夹,而不是使用列出文件夹的默认方式。所以,就我而言,正确的命令是java cvfe App.jar App -C target/classes .。这样会直接将target/classes目录下的所有文件添加到App.jar的根目录下,从而解决问题。

【讨论】:

这是唯一对我有帮助的答案!谢谢。除了 (cd) 进入包含包/类的文件夹之外,还有其他方法吗? 我已经阅读了几十个关于这个主题的不同主题和文档。除了你的回答,一切都没有用。谢谢。 @noctua 你应该看看 int -C 选项。 jar cfmv Jarfilename.jar manifest.txt ./classes/PackageName -C classes . 这将帮助您避免 cd 进入类目录。在-C 选项上,docs.oracle.com/javase/tutorial/deployment/jar/view.html @Log2 我知道,但是看看 noctua 在评论中问了什么。他可能没有阅读您回答中的最后一件事。他问了你所指出的问题,我重复了一遍。我试图帮助 noctua。我也在评论中感谢你,因为你的回答是唯一有用的。 @JasonKim 抱歉,我没有意识到你只是在为他重复。我不是故意要叫你出来的。【参考方案11】:

我是这样工作的:

TestClass.Java

package classes;

public class TestClass 

    public static void main(String[] args) 
        System.out.println("Test");
    


在命令行上使用javac 生成TestClass.class。将TestClass.class 放入文件夹classes/

MANIFEST.MF

Manifest-Version: 1.0
Main-Class: classes.TestClass

然后运行

jar cfm test.jar MANIFEST.MF classes/

然后运行它

java -jar test.jar

【讨论】:

我想指出答案中隐含的一点:“cd”到将被使用的路径很重要,因为类路径是 TestClass.class 在没有 jar 文件的情况下运行的。例如,“cd /MyEclipseWorkspace/MyProject/bin” 如果 jar 使用类文件的绝对路径,它可能会失败,并出现“找不到或加载主类”错误。例如,这是错误的:jar cfm test.jar manifest.txt /absolutepath/classes/TestClass.class @Corral 的评论不应被忽略。我一直在努力解决这个问题,直到我读到它,现在我的罐子运行得很好。 &gt;%JAVAHOME%\bin\jar cfM MANIFEST.MF test.jar classes/ 导致 test.jar : no such file or directoryMANIFEST.JS 现在已损坏(现在是其二进制文件)。【参考方案12】:

我遇到这个错误是因为我在 MANIFEST.MF 中写了错误的 Class-Path

【讨论】:

【参考方案13】:

MANIFEST.MF 中的错误条目 导致加载失败时,我遇到了一个奇怪的问题。这是我试图启动一个非常简单的 scala 程序的时候:

不正确:

Main-Class: jarek.ResourceCache
Class-Path: D:/lang/scala/lib/scala-library.jar

正确:

Main-Class: jarek.ResourceCache
Class-Path: file:///D:/lang/scala/lib/scala-library.jar

由于版本不正确,我收到一条神秘消息,与 OP 一样。可能它应该在解析清单文件时说 malformed url exception

在清单文件中使用绝对路径是 IntelliJ 用来为程序提供长类路径的方法。

【讨论】:

这对我没有帮助。我是否需要为我添加的所有类路径添加 file:/// 是的,所有的罐子都需要。【参考方案14】:

我有一个类似的问题,我可以通过授予 jar 文件所在的所有父文件夹的执行权限来解决(在 linux 系统上)。

例子:

/folder1/folder2/folder3/executable.jar

所有3个文件夹(folder1、folder2和folder3)以及executable.jar都需要当前用户的执行权限,否则返回错误“Could not find or load main class ...”。

【讨论】:

【参考方案15】:

我按照以下说明在 Eclipse 中创建一个可执行的 .jar。然后运行命令“java -jar .jar”启动程序。

它负责为您创建 mainfest 并包含主类和库文件部分。

http://java67.blogspot.com/2014/04/how-to-make-executable-jar-file-in-Java-Eclipse.html

【讨论】:

【参考方案16】:

至少我这样做的方式如下:

如果您有一个嵌套的 src 树(例如 com.test.myclass.MyClass)并且您是从根目录编译,您需要执行以下操作:

1) 创建 jar 时(通常将其放在脚本中): jar -cvfm my.jar com/test/myclass/manifest.txt com/test/myclass/MyClass.class

2) 清单应如下所示:

Mainfest 版本:1.0 主类:com.test.myclass.MyClass 类路径:.我的.jar

3) 现在您可以像这样从任何地方运行 jar:

java -jar my.jar

希望这对某人有所帮助

【讨论】:

【参考方案17】:

java -cp "full-path-of-your-jar" Main

在某个包中运行具有“public static void main”的任何其他类,

java -cp "full-path-of-your-jar" package1.package2.packages-hierarchy.ClassHavingMain

【讨论】:

当你对某事投反对票时,请添加解释。 如果你和你的jar在同一个目录,是否必须放完整路径?【参考方案18】:

如果没有完整的信息,这很难调试。

此时最有可能发生的两件事是 jar 中的文件未存储在 JAR 中的目录中,或者它不是正确的文件。

您需要存储 TestClass.class - 这里有些新人存储源文件 TestClass.java。

您需要创建 jar 文件,以便 TestClass.class 出现一个类路径。确保它不是“/classes”。使用 zip 查看文件并确保它具有“类”路径。

【讨论】:

天哪,这就是发生在我身上的事!我的 ant jar 任务的前缀是“/”,但需要“”。【参考方案19】:

1.创建一个名为 Manifest.txt 的文本文件,并将值提供为

主类:classes.TestClass

2.创建jar为

jar cfm test.jar Manifest.txt classes/*.class

3.运行jar为

java -jar test.jar

【讨论】:

你能告诉你你的java路径和类路径是怎么设置的吗?在回复之前,您可以尝试一件事。尝试通过命令行而不是 Eclipse 运行相同的 TestClass。 我可以使用命令行很好地运行该课程。与 javac 等其他 java 命令一起使用。

以上是关于无法使用 Jar 文件找到或加载主类的主要内容,如果未能解决你的问题,请参考以下文章

GMavenPlus:Groovy 到 JAR - 无法找到或加载主类。主类存在,清单文件显示有效

错误:无法找到或加载主类 Maven Spring Boot 应用程序 - 可执行 JAR

运行maven-assembly创建的可执行jar:错误:无法找到或加载主类

错误:无法找到或加载主类 sample.Main

java找不到或无法加载主类

Kotlin Gradle 无法找到或加载主类