【问题标题】:Could not find or load main class with a Jar File无法使用 Jar 文件找到或加载主类
【发布时间】: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 包混淆了。

标签: java class jar main


【解决方案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 命令一起使用。
                        猜你喜欢
                        • 1970-01-01
                        • 2019-07-21
                        • 2020-02-18
                        • 2017-02-07
                        • 2017-11-06
                        • 2015-03-05
                        • 2018-01-12
                        • 2021-12-10
                        • 1970-01-01
                        相关资源
                        最近更新 更多