zoukankan      html  css  js  c++  java
  • 使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

    java项目结构如下:

    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);
            
        }
        
    }
    View Code
    右键项目进行导包成jar文件,资源文件不导。如图所示

      

      下一步

      

      下一步

      

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

      

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

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

      选择好后界面如下:

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

    视图如下:

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

    百度网盘:

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

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

    下一步

     下一步

    下一步

    设置好后界面如下:

     下一步

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

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

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


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

    下一步

    下一步

    下一步

    下一步

    下一步

    下一步

    下一步

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

    大功告成

    看效果图:

    安装后目录:

    参考:

    用exe4j+Inno_setup打包java桌面应用

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

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

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

  • 相关阅读:
    MySQL: MySQL数据学习专题
    安装Team Foundation Server 2012过程截图
    如果你喜欢一个程序员小伙
    ASP.net MVC: 一个开源的“留言系统”
    ASP.net MVC 中Security.FormsAuthentication验证用户的状态(匿名|已登录)
    Microsoft Visual Stadio 2012 Ultimate版安整过程安装体验
    win8全面开放民间下载地址!win8下载地址 win8下载链接
    【技术贴】解决右键没有新建文本文档|右键没有新建txt
    【技术贴】虚拟机网络上有重名的解决|虚拟机Net模式提示有重名
    【技术贴】利用myeclipse自动生成java类图|java源代码自动生成类图
  • 原文地址:https://www.cnblogs.com/caihongmin/p/10554805.html
Copyright © 2011-2022 走看看