写在前面:
我们知道,在用java写好程序后,我们可以先用javac命令.java编译文件,再用java命令运行.class文件。但是,我们希望的是我们的程序可以直接被终端用户使用(哪怕它很简单,只是一个简单的命令行交互或者是简单的图形界面)。那么,如何才能做到这一点呢?在用C或C++编程时,可以方便地用gcc命令将文件编译为.exe文件,点击即可运行。但是java中该如何做到类似的效果呢?这篇文章将会帮助大家建立本地可执行java文件。
1.程序内容
我们借鉴上一篇博客中的双按钮监听机制的图形界面程序,代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MyApp {
JFrame frame;
JLabel label;
boolean flag = false;
int red = 0, green = 0, blue = 0;
public static void main(String[] args) {
MyApp app = new MyApp();
app.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new JLabel("I am waiting for you!");
JButton labelButton = new JButton("Change a label");
labelButton.addActionListener(new LabelListener());
JButton circleButton = new JButton("Change a circle");
circleButton.addActionListener(new CircleListener());
flag = true;
MyDrawPanel myPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.SOUTH, circleButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.getContentPane().add(BorderLayout.CENTER, myPanel);
frame.setSize(300, 300);
frame.setVisible(true);
}
class LabelListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
label.setText("OhCh!");
}
}
class CircleListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
flag = true;
frame.repaint();
}
}
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) { // this method is called every time the button is clicked
g.fillRect(0, 0, this.getWidth(), this.getHeight());
if (flag == true) {
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color randomColor = new Color(red, green, blue);
g.setColor(randomColor); // Set random color
g.fillOval(70, 70, 100, 100); // Make a oval(circle)
flag = false;
} else {
Color randomColor2 = new Color(red, green, blue);
g.setColor(randomColor2); // Set random color
g.fillOval(70, 70, 100, 100); // Make a oval(circle)
}
}
}
}
2.执行步骤
假设我们将MyApp.java文件存储在桌面文件夹的source文件夹中,并且桌面上有另一文件夹(为空)叫classes。
(1)首先编译MyApp.java文件,并将编译后的文件存入目标文件夹classes中。
C:\Users\Administrator\Desktop\source>javac -d ../classes MyApp.java
得到classes文件内的class文件如下图所示:
(2)在classes文件夹内新建名为manifest.txt的文件,并打开,添加语句如下:
Main-Class: MyApp
这表示主程序在MyApp类中。
注意,该语句最后要加入换行,否则可能不能正常执行。
(3)使用jar命令
C:\Users\Administrator\Desktop\source>cd ../classes
C:\Users\Administrator\Desktop\classes>jar -cvmf manifest.txt app1.jar *.class
在classes文件夹内得到一个新的文件,如下图所示:
我们可以双击这个程序,希望它能够运行。
得到如下图所示:
经测试,程序可以正常执行。
注意1:上图经过点击放大处理。
注意2:没有安装JVM的机器无法运行Executable Jar File 文件