首页 文章

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

提问于
浏览
32

我正在尝试使用加载jar

@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 .

我还应该做什么?

11 回答

  • 9

    java -cp“full-path-of-your-jar”Main

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

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

  • 4

    1.创建一个文本文件calles Manifest.txt并提供值为

    Main-Class:classes.TestClass

    2.创建 jar

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

    把 jar 弄得像

    java -jar test.jar

  • 16

    我最后遇到了同样的问题,因为我复制并粘贴了单词的代码,这是一个稍微不同的' - '字符使用类型,这就是我能想到的,当我手动键入它时它工作了

  • 0

    没有完整的信息,这很难调试 .

    此时最令人讨厌的两个问题是jar中的文件没有存储在JAR中的目录中,或者它不是正确的文件 .

    你需要存储TestClass.class - 一些人在这个商店新建了源文件TestClass.java .

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

  • 1

    我得到它像这样工作:

    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
    
  • 2

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

    例:

    /folder1/folder2/folder3/executable.jar

    所有3个文件夹(folder1,folder2和folder3)以及executable.jar都需要当前用户的execute-privilege,否则返回错误“找不到或加载主类...” .

  • 2

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

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

    1)当你创建jar时(通常把它放在一个脚本中):jar -cvfm my.jar com / test / myclass / manifest.txt com / test / myclass / MyClass.class

    2)清单应该如下:

    Mainfest-version:1.0 Main-Class:com.test.myclass.MyClass Class-Path :. my.jar

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

    java -jar my.jar

    希望这有助于某人

  • 1

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

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

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

  • 0

    an incorrect entry in 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一样 . 可能在解析清单文件时应该说出格式错误的url异常 .

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

  • 0

    我有这个错误,因为我在 MANIFEST.MF 中写了一个错误的类路径

  • 18

    我知道这是一个老问题,但我最近遇到了这个问题,没有一个答案对我有帮助 . 然而,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 的根目录,从而解决问题 .

相关问题