运行.jar文件时发生NoClassDefFoundError

时间:2015-05-06 11:53:11

标签: java jar noclassdeffounderror

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

 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?

2 个答案:

答案 0 :(得分:2)

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

您的课程在mp6包中。因此,在jar中,.class文件也必须位于文件夹mp6中。主要类的名称不是HelloViewer,而是mp6.HelloViewer

所以,cd进入父目录(包含mp6文件夹的目录),并使用

jar cfe Hello.jar mp6.HelloViewer mp6

答案 1 :(得分:0)

这是因为您没有正确创建jar。您的类属于包,因此必须位于具有相同名称的目录中。

当您运行命令

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

在您的类文件所在的目录中创建jar而不使用路径mp6。我猜你的类在目录./mp6中,所以去一个目录并运行命令

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

然后运行jar -vft yourjar.jar

检查jar

你必须看到类似的东西:

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

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