【问题标题】:NoClassDefFoundError when compiling a HelloWorld programming to a jar将 HelloWorld 编程编译到 jar 时出现 NoClassDefFoundError
【发布时间】:2013-05-15 07:26:46
【问题描述】:

这就是我所拥有的。

我有我的“MyJava”文件夹,其中包含所有内容。

MyJava/src/a/HelloWorld.java
MyJava/src/b/Inner.java
我的Java/bin/
MyJava/manifest.txt

HelloWorld.java:

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello, World");

        Inner myInner = new Inner(); 
        myInner.myInner(); 
    }
}

Inner.java:

public class Inner {

    public void myInner() {
        System.out.println("Inner Method");
    }
}

Manifest.txt:

主类:HelloWorld

首先我将 .javas 编译为 .class:

javac -d bin src/a/HelloWorld.java src/b/Inner.java

现在我将它们放入一个 .jar 文件中 jar cvfm myTwo.jar manifest.txt bin/*.class

现在我尝试运行 jar: java -jar myTwo.jar

我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
...
Could not find the main class: HelloWorld. Program will exit.

我知道这是一个非常简单的问题,我错过了什么?

【问题讨论】:

  • 它不是包的一部分。
  • 为什么这两个类在不同的目录下?
  • 嗯...我正在研究如何编译某些东西。虽然类似的东西确实使用包。
  • 本地文件系统上Java源代码中的包通常对应于源代码所在的目录。因此,如果一个类有包pkg.name 和名称MyClass,它应该在路径pkg/name/MyClass.java 中。我建议如果您的类都在同一个包中(似乎是默认包),它们应该在同一个目录中。有很多不同的方法,但我建议你暂时坚持最简单的方法。

标签: java jar compilation noclassdeffounderror manifest.mf


【解决方案1】:

如果您检查 .JAR 中的文件,您会注意到已编译的类位于 bin 目录中(因此无法找到,因为您的清单引用了顶层中的类)。
像这样更改您的 jar... 命令:

jar cvfm myTwo.jar manifest.txt -C bin .

另请参阅 Java 教程的 "Creating a JAR File" section

【讨论】:

    【解决方案2】:

    其中一种解决方案是将以下行添加到 manifest.txt

    Class-Path: bin/
    

    然后您可以使用“您的”命令来创建 jar:

    jar cvfm myTwo.jar manifest.txt bin/*.class
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多