运行 .jar 文件时出现 NoClassDefFoundError

NoClassDefFoundError occurs when running .jar file

对于学校,我们正在学习 .jar 文件以及如何创建它们。下面我有一个简单的 GUI 组件和查看器的代码。

 package mp6;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import javax.swing.JComponent;

public class HelloComponent extends JComponent 
{

public void draw(Graphics2D g2)
{
    g2.setFont(new Font("Arial", Font.ITALIC, 48));
    g2.setColor(Color.red);
    g2.drawString("Hello ", 40, 150);
    g2.setColor(Color.green);
    g2.drawString("Coloured ", 165, 150);
    g2.setColor(Color.blue);
    g2.drawString("JAR File", 380, 150);
}

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    draw(g2);
}
}

观看者:

package mp6
import javax.swing.JFrame;


public class HelloViewer {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
{
    final int FRAME_WIDTH = 600;
    final int FRAME_HEIGHT = 300;

    HelloComponent comp = new HelloComponent();

    JFrame frame = new JFrame();
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
    frame.setTitle("Hello World in Colour");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(comp);
    frame.setVisible(true);
}

}

使用命令行编译成.class文件后,我使用命令

jar cfe Hello.jar HelloViewer HelloViewer.class HelloComponent.class

对于练习,我们需要使用-e 命令来设置入口点。这将创建一个名为 Hello.jar 的 .jar 文件。如果 运行 通过双击 .jar,则会发生 Java 异常。如果通过命令行 运行 显示错误

"Exception in thread main java.lang.NoClassDefFoundError: HelloViewer (wrong name: mp6/HelloViewer)". 

导致此错误的原因是什么?我是否使用了正确的命令来构建 .jar?

不对,你没有使用正确的命令。

您的 classes 在 mp6 包中。因此,在 jar 中,.class 文件也必须位于 mp6 文件夹中。而主class的名字不是HelloViewer,而是mp6.HelloViewer.

因此,cd进入父目录(包含 mp6 文件夹的目录),然后使用

jar cfe Hello.jar mp6.HelloViewer mp6

发生这种情况是因为您没有正确创建 jar。您的 classes 属于包,因此必须位于同名目录中。

当你运行宁命令

jar cfe Hello.jar HelloViewer HelloViewer.class HelloComponent.class

在 class 文件所在的目录中创建没有路径 mp6 的 jar。我猜你的 classes 在目录 ./mp6 中,所以向上一个目录然后 运行 命令

jar cfe mp6/Hello.jar mp6/HelloViewer mp6/HelloViewer.class HelloComponent.class

然后通过 运行ning jar -vft yourjar.jar

检查 jar

你必须看到这样的东西:

mp6/Hello.jar 
mp6/HelloViewer 
mp6/HelloViewer.class 

现在你可以使用你的罐子了。