运行 .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
现在你可以使用你的罐子了。
对于学校,我们正在学习 .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
你必须看到这样的东西:
mp6/Hello.jar
mp6/HelloViewer
mp6/HelloViewer.class
现在你可以使用你的罐子了。