0

我使用 IntelliJ 构建了一个 jar,正确设置了主类。

当我从命令行(Windows)运行“java -jar foo.jar”时,我得到一个异常,声称主文件丢失。主类看起来像:

package mypackage;

public class LockUtil {
  public static void main(String[] args) {
  ...

我收到以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: mypackage/LockUtil
Caused by: java.lang.ClassNotFoundException: mypackage.LockUtil
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: mypackage.LockUtil. Program will exit.

清单文件包含:

Manifest-Version: 1.0
Created-By: IntelliJ IDEA
Main-Class: mypackage.LockUtil

jar 包含带有 .class 文件的适当目录结构。

4

5 回答 5

2

如果你这样做java -tf foo.jar,你看到这样的东西吗?

META-INF/
META-INF/MANIFEST.MF
mypackage/
mypackage/LockUtil.class

那里的某个地方可能有另一个目录级别吗?

您可以通过使用以下内容构建 jar 文件来确保 Java 知道主文件存在:

jar cfe foo.jar mypackage.LockUtil mypackage/LockUtil.class
于 2009-07-02T16:03:26.137 回答
1

LockUtil 是否依赖于另一个不可解析的类,从而不允许 LockUtil 加载?

于 2009-07-02T16:19:01.243 回答
1

您正在尝试执行mypackage.LockUtil,但您应该使用mypackage.locking.LockUtil(注意package类开头的语句。)。

另一种可能性是您已经移动了班级并忘记了更新package语句。

于 2009-07-02T15:10:40.187 回答
0

看来您的包的名称是 mypackage.locking 而不仅仅是 mypackage

于 2009-07-02T15:10:54.307 回答
0

您的清单中的主类定义似乎指向 mypackage/LockUtil 而不是 mypackage/locking/LockUtil。

-瑞克

于 2009-07-02T15:11:33.103 回答