对于学校,我们正在了解.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?
答案 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
你必须看到类似的东西:
mp6/Hello.jar
mp6/HelloViewer
mp6/HelloViewer.class
现在你可以使用你的罐子了。