关于java:无法使用Jar文件查找或加载主类

Could not find or load main class with a Jar File

我试着用

1
2
3
@echo off
java -jar Test.jar
pause

有…的清单

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

在jar目录中,当我提取classes estclass文件时,我可以清楚地看到它。

编辑:classes.TestClass没有public static void main(String[] args)

classes.TestClass中的机组减速为package classes;

但我仍然收到错误信息

1
Could not find or load main class classes.TestClass

对于这个问题,我已经经历了我所能找到的一切,但似乎没有任何帮助。

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

我还应该做什么?


我让它像这样工作:

测试类

1
2
3
4
5
6
7
8
9
package classes;

public class TestClass {

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

}

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

MF宣言

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

然后运行

1
jar cfm test.jar MANIFEST.MF classes/

然后运行它作为

1
java -jar test.jar


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

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

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


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

Main-Class: classes.TestClass

2.将罐子创建为

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

3.把罐子当作

java -jar test.jar


我最后也遇到了同样的问题,因为我把代码从Word上复制粘贴下来,它是一种略微不同的"-"字符类型,这就是我所能想到的,当我手动输入时,它就工作了。


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

例子:

/folder1/folder2/folder3/executable.jar

所有3个文件夹(folder1、folder2和folder3)以及executable.jar都需要当前用户的执行权限,否则返回"找不到或加载主类…"错误。


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

此时最有可能看到的两件事情是JAR中的文件没有存储在JAR中的目录中,或者它不是正确的文件。

您需要存储testclass.class——这里有些人是新来的,他们存储源文件testclass.java。

您需要创建JAR文件,以便testclass.class以类的路径出现。确保它不是"/classes"。使用zip查看文件并确保其路径为"classes"。


我知道这是一个古老的问题,但最近我遇到了这个问题,所有的答案都没有帮助我。然而,科拉尔对瑞安·阿特金森的回答的评论确实让我对这个问题产生了兴趣。

我在target/classes中保存了所有已编译的类文件,在我的案例中这些文件不是包。我试图从我的项目的根目录中用jar cvfe App.jar target/classes 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的根目录中,从而解决问题。


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

不正确的:

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

对的:

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

由于版本不正确,我收到了一条神秘的信息,和OP一样。在分析清单文件时,它可能会说类似于格式错误的URL异常。

Intellij使用清单文件中的绝对路径为程序提供长类路径。


我按照下面的指令在Eclipse中创建一个可执行的.jar。然后运行命令"javajar .jar"启动程序。

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

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


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

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

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

2)清单应如下所示:

Mainfest版本:1.0主类:com.test.myclass.myclass类路径:我的罐子

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

Java- jar My.jar

希望这能帮助别人


通过ftp传输jar文件后,我收到了相同的错误消息,忘记了将其设置为二进制模式。


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


我有一个不相关的类路径库并解决相同的错误