普通java项目打包成jar文件后转EXE安装文件

一、背景

公司在做一个云服务项目,要求客户端用java封装浏览器内核来运行VUE项目,为方便客户使用就考虑到把jar文件转成EXE安装文件。

二、步骤简介

基于公司项目的需求和个人的理解,并参考网上大牛的经验,就有了下面的实现步骤:

1.创建普通java项目实现浏览器内核封装;

2.将项目打包成jar文件;

3.将jar问件转成exe可执行文件;

4.将exe可执行文件打包成exe安装文件;

三、创建普通java项目实现浏览器内核封装

1.打开Intelij Idea,点击FIle->New->Project,直接点"Next"

java打包成dll文件 java打包成安装包_java打包成dll文件


2.一路next到下图步骤,填写自己的项目名称和项目路径,点击“Finish"

java打包成dll文件 java打包成安装包_jar_02


3.创建的目录结构如下图所示

java打包成dll文件 java打包成安装包_eclipse_03


4.在src下新建package(我的package名称是com.bonwin),右键src目录选择New->Package,在弹出的文本框中输入package名称,如下图,然后回车保存。

java打包成dll文件 java打包成安装包_java打包成dll文件_04


5.我采用SWT组件来实现java封装浏览器内核的功能,需要引入swt.jar包。在项目目录(javaclient)下创建lib目录,将swt.jar包放在lib目录下,然后点击File->Project Structure,选择Liberaries,点击“+”选择lib下的swt.jar,然后点“OK”,再点“OK”,这样swt.jar就被引入到项目中了。

java打包成dll文件 java打包成安装包_java_05


6.在com.bonwin包下创建Java Class文件,右键com.bonwin选择New->Java Class,在弹出的文本框中输入文件名称,我的文件名称是SWTBrowser(是main方法所在的类文件,直接在main方法中封装浏览器内核),详细代码如下:

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;

public class SWTBrowser {
    private static Image trayIcon;
    public static void main(String args[]) {
        Display display = new Display();
        Shell shell = new Shell(display,SWT.MIN | SWT.CLOSE);
        trayIcon = new Image(display, "bonwin.png");
        shell.setImage(trayIcon);
        shell.setText("邦威酒店管理软件");
        Color bgc = new Color(display,new RGB(231,240,255));
        Rectangle area = Display.getDefault().getClientArea();
        shell.setBounds(area);
        final Browser browser = new Browser(shell, SWT.FILL);
        browser.setBounds(area);
        String mac = "";
        try {
            InetAddress ia = InetAddress.getLocalHost();
            String ip = ia.getHostAddress();
            mac = getLocalMac(ia);
            browser.addMouseListener(new MouseListener() {
                public void mouseDoubleClick(MouseEvent arg0) {
                }
                public void mouseDown(MouseEvent event) {
                    //event.button == 3 代表右击操作
                    if (event.button == 3)
                        browser.execute("document.oncontextmenu = function() {return false;}");
                }

                public void mouseUp(MouseEvent arg0) {
                }
            });

            browser.setUrl("http://www.baidu.com");
        }catch (Exception e){
            e.printStackTrace();
        }
        shell.open();
        shell.addShellListener(new ShellAdapter() {
            @Override
            public void shellClosed(ShellEvent e) {
                MessageBox mb = new MessageBox(shell,SWT.ICON_QUESTION | SWT.OK| SWT.CANCEL);
                mb.setText("提示");
                mb.setMessage("确定要关闭吗?");
                e.doit = mb.open() == SWT.OK;
            }
        });
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
    public static String getLocalMac(InetAddress ia) throws SocketException{

        //获取bai网卡,获取地址
        byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();

        System.out.println("mac数组长度:"+mac.length);

        StringBuffer sb=new StringBuffer("");
        for(int i=0;i< mac.length;i++){
            if(i!=0){
                sb.append("-");
            }
            //字节转换为整数
            int temp = mac[i]&0xff;
            String str = Integer.toHexString(temp);
//            System.out.println("每8位:"+str);
            if(str.length()==1){
                sb.append("0"+str);
            }else{
                sb.append(str);
            }
        }
        System.out.println("本机MAC地址:"+sb.toString().toUpperCase());
        return  sb.toString().toUpperCase();
    }

}

注意:代码中用到的bonwin.png图片文件需要放在src所在的目录里,和src处在同一级位置,否则idea里直接运行代码时会报找不到bonwin.png的错误。

7.运行验证代码是否有问题,正常启动并出现下图窗口界面表示代码没问题,至此Java封装浏览器内核的简单功能就实现了。

java打包成dll文件 java打包成安装包_java_06


四、将项目打包成jar文件

1.点击Idea的File->Project Structure打开对应窗口,选择Atifacts页面,然后点击“+”,选择jar->From Modules With Depencencies…

java打包成dll文件 java打包成安装包_java打包成dll文件_07


2.在打开的窗口中输入Module(填写项目名称)和Main Class(选择项目main方法所在的java类),然后点“OK”。

java打包成dll文件 java打包成安装包_jar_08


3.在当前页面再点“OK”,

java打包成dll文件 java打包成安装包_java_09


4.点击Build->Build Artifacts…

java打包成dll文件 java打包成安装包_java_10

5.在弹出的菜单中选择“Build”,项目就会被打包

java打包成dll文件 java打包成安装包_jar_11

7.打包完成后,项目中就会多了out/javaclient_jar/javaclient.jar文件,这个javaclient.jar就是我们需要的jar文件

java打包成dll文件 java打包成安装包_jar_12


8.把项目中用的的bonwin.png文件复制到javaclient.jar所在的目录下,然后在Idea里打开Terminal,进入javaclient.jar所在目录下运行java -jar javaclient.jar命令,项目就被正常启动了

java打包成dll文件 java打包成安装包_jar_13

java打包成dll文件 java打包成安装包_java打包成dll文件_14


五、将jar问件转成exe可执行文件

1.工具launch4j下载

百度网盘:https://pan.baidu.com/s/1RFOm9DmlkNO-QhQRGoxLQQ

提取码:1688

2.launch4j安装

3.准备好要打包的文件,自己创建一个文件夹,把javaclient.jar、bonwin.png都放在这个文件夹下,我是在D盘创建了一个bonwin文件夹,另外再找一个图标文件(文件格式必须是.ico)同样放在这个文件夹下,我的是favicon.ico,同时要将jdk下jre整个目录全部复制到bonwin这个文件夹

java打包成dll文件 java打包成安装包_eclipse_15


4.打开launch4j,按图中要求填写

java打包成dll文件 java打包成安装包_java打包成dll文件_16


java打包成dll文件 java打包成安装包_eclipse_17

5.然后点保存按钮把配置信息保存成xml文件,接着点击执行按钮生成exe文件

java打包成dll文件 java打包成安装包_java_18

5.此时就会在bonwin文件夹中生成BWHOTEL.exe文件,双击就会启动运行程序,到现在就把jar文件成功转成了exe可执行文件了


六、将exe可执行文件打包成exe安装文件

1.工具Inno Setup下载

百度网盘:https://pan.baidu.com/s/1ZqomiVgVA8eZxgHMvLoumw

提取码:1688

2.工具Inno Setup安装

3.打开Inno Setup编译器,出现如下窗口

java打包成dll文件 java打包成安装包_java打包成dll文件_19


点击下一步,出现如下界面

java打包成dll文件 java打包成安装包_jar_20

这里要填写程序的名字,如“My App”,用用版本“1.00”,应用程序的发布者“ My Company”,及应用程序的网站“XXXXX”,后两者可以不写。点击下一步出现如下界面

java打包成dll文件 java打包成安装包_eclipse_21

来这里根据自己的情况填写应用目标基本文件夹和应用程序文件夹名称,点击下一步,出现如下界面

java打包成dll文件 java打包成安装包_jar_22

这里首先要选择应用程序的这性文件,也就是XXXX.exe文件,点击右侧的浏览找到你的执行文件即可。下边的“允许用户在安装完成后启动应用程序”,勾选前面的对勾,即可,若禁止安装完成后就运行程序,可不选择此项。下边的“其他应用程序文件”比较重要,一般包含程序用到的其他相关文件,点击下一步,出现如下界面

java打包成dll文件 java打包成安装包_jar_23


默认即可,点击下一步出现如下界面

java打包成dll文件 java打包成安装包_eclipse_24


默认空,点击下一步,出现如下界面,

java打包成dll文件 java打包成安装包_jar_25


再点击下一步,出现如下界面

java打包成dll文件 java打包成安装包_java_26

在这里选择编译文件的输出文件夹,输出地文件名等,还可以加载自定义的安装程序图标,填写完成后,点击下一步,出现如下界面

java打包成dll文件 java打包成安装包_eclipse_27


点击下一步,出现如下界面

java打包成dll文件 java打包成安装包_java打包成dll文件_28


点击完成,进入Inno Setup的编译器,如下图,

java打包成dll文件 java打包成安装包_java打包成dll文件_29


点击是,出现如下界面

java打包成dll文件 java打包成安装包_java_30


点击是,出现如下界面

java打包成dll文件 java打包成安装包_jar_31

文本(.iss文件)的输出文件夹,点保存后自动运行编译,编译完成后bonwin-setup.exe安装文件就在上面指定的“编译器输出文件夹”下生成了,至此我们就可以直接运行bonwin-setup.exe来安装我们的java程序了。
七、SWT概述
SWT是IBM公司开发的UI开发组件,它与AWT/SWING组件类似,但是SWT克服了AWT/SWING中许多问题,所以用SWT编写UI程序无论在美观成都还是响应速度上都远远超越了AWT和SWING.这主要是因为AWT只是单纯模拟本地操作系统窗口组件,而SWT最大化了操作系统的图形构件API,也就是说只要操作系统提供了图形构件,SWT就可以利用JNI调用他们,只有操作系统中不提供的组件SWT才会去模拟实现. 由于使用了JNI,使得它和本地操作系统紧密连接在一起,因此编写的界面和本地系统窗口几乎没有区别.