[英]Could not find or load main class with a Jar File
我正在尝试使用加载 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)
。
Package班级减速classes.TestClass
为package classes;
但我仍然不断收到错误消息
Could not find or load main class classes.TestClass
我已经解决了这个问题所能找到的所有问题,但似乎都无济于事。
我试过编辑类路径、重做清单、安装新的 JRE。
我还应该做什么?
我让它像这样工作:
测试类.Java
package classes;
public class TestClass {
public static void main(String[] args) {
System.out.println("Test");
}
}
在命令行上使用javac
生成TestClass.class
。 将TestClass.class
放在文件夹classes/
。
清单文件
Manifest-Version: 1.0
Main-Class: classes.TestClass
然后运行
jar cfm test.jar MANIFEST.MF classes/
然后运行它
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
即使您在单词 jar 之前错误地错过了“-”,也会出现此错误
错误的命令java jar test.jar
正确的命令java -jar test.jar
1.创建一个名为 Manifest.txt 的文本文件并提供值作为
主类:classes.TestClass
2.创建罐子
jar cfm test.jar Manifest.txt classes/*.class
3.运行jar作为
java -jar 测试.jar
我知道这是一个老问题,但我最近遇到了这个问题,但没有一个答案对我有帮助。 然而,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 来解决jar cvfe App.jar . App
jar cvfe App.jar . App
。 这在我看来是相当麻烦的。
简单的解决方案是使用-C
选项列出要添加的文件夹,而不是使用列出文件夹的默认方式。 所以,就我而言,正确的命令是java cvfe App.jar App -C target/classes .
. 这将直接将target/classes
目录中的所有文件添加到App.jar
的根目录,从而解决问题。
由于从 Microsoft Word 文档复制和粘贴代码,我遇到了同样的问题。 似乎有一种稍微不同类型的破折号-
使用的字符,当我用正确的字符替换较长的破折号时-
程序正确执行
如果没有完整的信息,这是很难调试的。
此时最可能出现的两个情况是,jar 中的文件未存储在 WITHIN THE JAR 的目录中,或者它不是正确的文件。
您需要存储 TestClass.class - 一些新人在此存储源文件 TestClass.java。
并且您需要创建 jar 文件,以便 TestClass.class 与类路径一起出现。 确保它不是“/classes”。 使用 zip 查看文件并确保它具有“类”路径。
我有一个类似的问题,我可以通过为 jar 文件所在的所有父文件夹(在 linux 系统上)授予执行权限来解决这个问题。
例子:
/folder1/folder2/folder3/executable.jar
所有 3 个文件夹(文件夹 1、文件夹 2 和文件夹 3)以及 executable.jar 都需要当前用户的执行权限,否则将返回错误“无法找到或加载主类...”。
当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 用来为程序提供长类路径的方法。
至少我这样做的方式如下:
如果您有一个嵌套的 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
希望这有助于某人
我按照以下说明在 Eclipse 中创建一个可执行的 .jar。 然后运行命令“java -jar .jar”来启动程序。
它负责创建 mainfest 并为您包含主类和库文件部分。
http://java67.blogspot.com/2014/04/how-to-make-executable-jar-file-in-Java-Eclipse.html
我有这个错误,因为我在我的MANIFEST.MF
写了一个错误的类路径
如果您使用包名称,它将不适用于包含点的文件夹( 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'`
在 IntelliJ 中,尝试将 lib 文件夹从主项目文件夹添加到工件时出现此错误。
在 src 文件夹中放置和使用 lib 文件夹有效。
此错误消息的可能原因:
无法找到或加载主类
是当主类扩展(或实现)另一个不在类路径上的类(或接口)时。
我通过FTP传输jar文件并忘记设置二进制模式后收到相同的错误消息。
我有这个错误,因为我通过 IntellijIDEA 从库中提取 JAR 文件到目标 JAR。 当我选择另一个选项“复制到输出目录...”时,它解决了问题。 希望这对你有帮助
我收到此错误是因为我的主类在测试包中,并且我正在使用 IntelliJ 创建工件。 在创建工件时选中包含测试框后,它得到了解决。
通过 maven 打包时,有时可能会丢失 pom.xml 中<build>
标记下的以下行。 因为src文件夹包含您的 java 文件
<sourceDirectory>src</sourceDirectory>
如果您使用 Maven 项目进行设置——请确保以下内容与 pom.xml 文件中的 JDK 匹配。
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target>
在我的情况下,我将它设置为 14,而我的应用程序设置为 14——冲突导致我的 jar 文件给出类未找到错误。
对于 IntelliJ 用户 - 当无法找到的 class 放置在标记为测试的目录中(目录图标上以绿色表示)时,也会发生这种情况。
要解决这个问题:
一个。 将 class 移动到源目录(首选)
或者
湾。 确保在创建工件时选中“包含测试”复选框
我在 IntelliJ 中使用工件时遇到了同样的问题。 使用复制所有依赖项 jar 后,它对我有用。
您需要使用-jar
参数来设置您的 jar 的路径:
java -jar your_jar.jar
如果清单正确,则无需手动设置 main class。
我有一个incorret class-path librarie并解决相同的错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.