无法使用 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 中的 <build>
标记下丢失以下行。因为 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 的评论不应被忽略。我一直在努力解决这个问题,直到我读到它,现在我的罐子运行得很好。>%JAVAHOME%\bin\jar cfM MANIFEST.MF test.jar classes/
导致 test.jar : no such file or directory
和 MANIFEST.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