使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

时间:2023-03-09 16:20:16
使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

java项目结构如下:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

Demo是模仿程序快照,主要设计两个按钮:保存快照和恢复快照;

保存快照将对象(窗口)序列化保存下来,后面无论做了什么操作,只要点击恢复快照,

就会读取之前保存的序列化的对象。

package demo;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea; /**
* 提供保存快照和恢复快照方法的类
* @date 2019年3月11日下午3:58:55
* @version 1.0
*/
class Snapshot{
//快照文件
String snapshotFile = "E:/Snapshot.dat"; //保存快照
public void saveSnapshot(MyFrame myFrame) throws IOException {
FileOutputStream fout = null;
ObjectOutputStream out = null;//对象输出流 try {
fout = new FileOutputStream(snapshotFile);
out = new ObjectOutputStream(fout);//构造对象输出流
out.writeObject(myFrame);//序列化
} catch (FileNotFoundException e) {
System.out.println("建立快照文件失败");
e.printStackTrace();
} catch (IOException e) {
System.out.println("写出发生了I/O异常");
e.printStackTrace();
}finally {
if (out != null) {
out.close();//只关闭处理流
}
}
} public MyFrame loadSnapshot() throws IOException{//读取快照
MyFrame myFrame = null;//存放恢复的窗口
FileInputStream fin = null;
ObjectInputStream in = null;//对象输入流 try {
fin = new FileInputStream(snapshotFile);
in = new ObjectInputStream(fin);//构造对象输入流
myFrame = (MyFrame)in.readObject();//反序列化
} catch (FileNotFoundException e) {
System.out.println("读取快照文件失败");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("找不到相应的类");
e.printStackTrace();
} catch (IOException e) {
System.out.println("读取发生I/O异常");
e.printStackTrace();
}finally {
if (in != null) {
in.close();
}
} return myFrame;
} } //实现Serializable接口的类的对象才能被序列化
class MyFrame extends JFrame implements ActionListener, Serializable{
/** serialVersionUID*/
private static final long serialVersionUID = -8045215058120011473L;
/*更改java默认标题栏图标*/ JButton save = new JButton("保存快照");
JButton Load = new JButton("恢复快照"); JPanel panel = new JPanel(); JTextArea textArea = new JTextArea("初始文字");
JScrollPane scrollPane = new JScrollPane(textArea);
//不序列化此字段
transient Snapshot snapshot = new Snapshot(); //snapshot字段的setter方法
public void setSnapshot(Snapshot snapshot) {
this.snapshot = snapshot;
} public MyFrame() {
initUI();
save.addActionListener(this);
Load.addActionListener(this);
} private void initUI() { // C:\\Users\\Administrator\\Desktop\\sna\\img\\ds.ico
// /img/ds.ico String img_path = "/img/tanke.jpg"; //Image img = ImageIO.read(this.getClass().getResource(img_path));
Image img = (Toolkit.getDefaultToolkit().getImage(this.getClass().getResource(img_path)));
setIconImage(img); setLayout(new BorderLayout());
textArea.setLineWrap(true);
add(scrollPane, BorderLayout.CENTER);
panel.add(save);
panel.add(Load);
add(panel, BorderLayout.SOUTH);
setTitle("程序快照机");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(200,140); } @Override
public void actionPerformed(ActionEvent e) {//当控件被激活时,jvm将传递ActionEvent对象通知 try{
if(e.getSource() == save){
snapshot.saveSnapshot(this);
System.out.println(e);
}else {
//否则单击的是恢复快照的按钮
MyFrame f = snapshot.loadSnapshot();
//此行不可少,因为为序列化MyFrame类的snapshot字段
f.setSnapshot(new Snapshot());
f.setVisible(true);//显示恢复原来的窗口
this.dispose();//关闭原来的窗口
}
}catch (Exception e1) {
System.out.println("保存快照时发生I/O错误");
} } } public class SnapshotDemo { public static void main(String[] args) {
MyFrame demo = new MyFrame();
demo.setVisible(true); } }
右键项目进行导包成jar文件,资源文件不导。如图所示

  使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

  下一步

  使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

  下一步

  使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

  我们在test项目底下创建MAINFEST.MF文件,文件内容如下:

  

Manifest-Version: 1.0
Main-Class: snapshot.SnapshotDemo
Class-Path:
Created-By: your name

  其中class-Path我们可不指定,因为在后面的exe4j中会设置到

  选择好后界面如下:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

点击finish后就可以在输出目录看到jar文件,这时我们还需将资源文件(如:img)拷到该目录,由于exe4j支持jdk_win32,我们只要拷走jdk中的jre文件。

视图如下:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

其中exe4j依赖低版本的jdk1.6。在这里我将exe4j、jdk1.6_32、jdk1.7_32、innoSetup文件放在:

百度网盘:

链接:https://pan.baidu.com/s/1Tizt5qOh8JLDHo3RzVdwrA
提取码:w1cz

下面开始使用exe4j将jar和资源文件打包成exe程序:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

设置好后界面如下:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下面我们来指定jre的位置,由于我把jre拷到跟jar同层目录,如下所示:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下面的一直默认下一步,程序运行效果图:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

此时我们可以将jre和jar删除,因为已经打包在demo.exe中了

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序


下面我们开始用InnoSteup来编译windows桌面安装程序:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

下一步

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

然后下一步下面都点是,最后它会要让你选择一个位置保存编译文件,必须选。

大功告成

看效果图:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

安装后目录:

使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

参考:

用exe4j+Inno_setup打包java桌面应用

https://blog.****.net/yege2006/article/details/51312989

一键搞定Java桌面应用安装部署 —— exe4j + Inno Setup 带着JRE, 8M起飞

https://blog.****.net/ouyangxin95/article/details/53009173