【问题标题】:java.lang.NoClassDefFoundError for Java Jar FileJava Jar 文件的 java.lang.NoClassDefFoundError
【发布时间】:2023-04-05 13:52:01
【问题描述】:

我正在尝试为我的一个 Java 文件创建一个 jar 文件。但是,一旦我创建它并尝试运行它,我就会得到一个 java.lang.NoClassDefFoundError。

我执行以下操作来创建 jar。该文件是 Worker.java,它位于 src/beatDB 中。

jar cfm Worker.jar Manifest.txt src/beatDB

我的 Manifest.txt 文件只是

Main-Class: Main-Class: beatDB.Worker \n(后缀换行)

当我运行 java -jar Worker.jar 时,我收到此错误。

Exception in thread "main" java.lang.NoClassDefFoundError:
beatDB/Worker
Caused by: java.lang.ClassNotFoundException: beatDB.Worker
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

但是,如果我运行 java beatDB/Worker,文件运行良好。

有人知道如何解决这个问题吗?

【问题讨论】:

  • Worker.java中的包声明是什么?
  • Worker.java中声明的包是我在manifest中指定的包
  • 所以Worker.java 中第一个非注释行是package package;?
  • 抱歉,我解决了我的问题。第一行是package beatDB;

标签: java eclipse jar


【解决方案1】:

您应该将清单与 .class 文件一起 jar,而不是 .java 文件。

.java 文件包含源代码。

.class 文件包含已编译的代码。对于 Java,它被称为字节码。

您希望您的类的包结构反映在您的 jar 文件中。如果你在 com.example 下有一个 Animal 类,那么你的 jar 文件应该包含 com/example/Animal.class

请参阅How to create jar file with package structure? 了解正确的 jar 文件包结构。

【讨论】:

  • 当我执行jar cfm Worker.jar Manifest.txt src/beatDB/*.class 时,运行jar 时仍然出现同样的错误
  • 你确定.class文件在src文件夹下吗?
  • 阳性。在创建 jar 文件以编译所有 java 文件之前,我做了javac src/beatDB/*.java。当我查看时,它们也出现在 src/beatDB 中。
  • jar cfm Worker.jar Manifest.txt src
  • 您希望您的类的包结构反映在您的 jar 文件中。如果你在 com.example 下有一个 Animal 类,那么你的 jar 文件应该包含 com/example/Animal.class
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多