【實用工具】使用Java封裝可執行exe應用全過程


本文將使用exe4j將java項目封裝為可以發送給他人使用的工具為例,來記錄將java項目封裝為exe文件的全過程

編寫java代碼

目標:創建相關java項目代碼,以實現相關功能

  • 創建一個java項目,目錄結構如下:

    項目結構1

  • 代碼如下:

CmdToolMain.java

package com.gf.tool_cmd.main;

import com.gf.tool_cmd.tool.CmdUtil;
import com.gf.tool_cmd.tool.JOptionPaneUtil;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class CmdToolMain {

    private static List<CMDRole> cmdRoles = new ArrayList<>();

    static {
        cmdRoles.add(new CMDRole("立刻關機", "shutdown -s -t 0"));
        cmdRoles.add(new CMDRole("計算器", "calc"));
        cmdRoles.add(new CMDRole("打開新記事本", "notepad"));
    }

    public static void main(String[] args) {
        String message = "請選擇操作";
        String title = "gf_cmd_tool";
        List<String> items = cmdRoles.stream().map(CMDRole::getDescribe).collect(Collectors.toList());
        int i = JOptionPaneUtil.chooseOne(message, title, items, 0);
        if (i == -1) {
            System.exit(0);
        }
        CmdUtil.execCommand(cmdRoles.get(i).getCmd());
    }

    @Data
    @AllArgsConstructor
    private static class CMDRole{
        private String describe;
        private String cmd;
        }

}
CmdUtil.java

package com.gf.tool_cmd.tool;

public class CmdUtil {

    public static void execCommand(String[] command) {
        for (int i = 0; i < command.length; i++) {
            System.out.print(command[i] + " ");
        }
        try {
            Runtime.getRuntime().exec(command);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static void execCommand(String command) {
        try {
            Runtime.getRuntime().exec(command);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}
JOptionPaneUtil.java

package com.gf.tool_cmd.tool;

import javax.swing.*;
import java.io.IOException;
import java.util.List;

public class JOptionPaneUtil {

    /**
     * 彈窗展示信息
     * @param title 標題
     * @param message 信息
     */
    public static void showInfo(String title,String message){
        JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE);
    }

    /**
     * 單選
     * @param objects 選項列表
     * @param defaultIndex 第幾個作為默認
     * @return 選擇了第幾個
     */
    public static int chooseOne(String message,String title,List objects,int defaultIndex){
        int questionMessage = JOptionPane.ERROR_MESSAGE;
        ImageIcon icon = null;
        return chooseOne(message,title,objects, defaultIndex, questionMessage,icon);
    }

    /**
     * 單選
     * @param message 信息
     * @param title 標題
     * @param objects 選項列表
     * @param defaultIndex 第幾個作為默認
     * @param messageType 消息類型 {@link JOptionPane#QUESTION_MESSAGE}
     * @return 選擇了第幾個
     */
    public static int chooseOne(String message,String title,List objects,int defaultIndex,int messageType,ImageIcon icon){
        Object o = JOptionPane.showInputDialog(
                null,
                message,
                title,
                messageType,
                icon,
                objects.toArray(),
                objects.get(defaultIndex)
        );
        return objects.indexOf(o);
    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gf</groupId>
    <artifactId>tool_cmd</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tool_cmd</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  • 執行main方法之后效果如下:

效果圖

到這項目代碼就准備好了,下一步進行打包操作


打包

目標:打出可執行的jar包,為了后期版本更新,需要封裝代碼中引入第三方的jar文件

  • 依次點擊 【FIle】->【Proiect structure】 進入項目設置(或者點擊快捷按鈕)

    項目設置快捷按鈕

  • 創建module

    進入創建頁面

  • 選擇啟動類

  • 選擇第三方jar包執行方式

  • 選擇打包配置文件存放目錄

    設置module

  • 右鍵點擊1,創建lib文件夾

  • 將第三方jar放入lib,也可以使用maven編譯命令,dependency:copy-dependencies 將用到的jar包提取出來,復制進lib文件夾

  • 點擊jar,設置第三方jar路徑

  • 點擊4,進入設置

  • 為每個第三方jar添加lib/前綴,

  • 保存

    設置module classPath

  • 編譯打包

    編譯打包

  • 編譯成功后就可以在上圖的文件接口圖中找到導出的artifacts文件夾

    項目結構2

  • 得到最終的lib文件夾和jar文件后,在 tool_cmd_jar 文件夾內打開cmd,使用java -jar tool_cmd.jar命令即可嘗試執行,一旦可以執行,即可進入下一步操作

詳細打包步驟可參考文章【IDEA如何打包可運行jar的一個問題


創建exe文件

目標:下載並安裝exe4j,使用exe4j對Java項目代碼創建可運行的.exe文件

  • 進行jre環境校驗

    安裝exe4j

  • 如果不通過會有錯誤提示,需要調整java jre環境

    jre報錯

  • 設置jre環境后可以在cmd里執行 java -version進行測試,如果出現以下打印,則為設置成功

    成功安裝jre環境

  • 打開exe4j文件,下一步即可

  • 選擇jar模式

  • 設置名稱和等會封裝的exe輸出路徑

  • 設置exe應用的名稱和圖標

  • 選擇jar路徑

  • 設置啟動類

  • 填寫jre版本

  • 完成封裝,可以在這里保存當前配置到exe4j文件,以便下次再次使用

  • 執行完的文件夾,會生成一個gf_tool.exe文件

  • 啟動gf_tool.exe會有這個提示,是因為exe4j軟件沒有激活是試用的

  • 打開exe4j,打開激活軟件,然后按圖中步驟點擊激活

  • 激活成功后首頁長這樣,再次打開軟件不會再有提示

壓縮

目標:將項目文件壓縮為自解壓文件,便於傳給他人使用

  • 使用winrar壓縮軟件將圖中框選的文件進行壓縮

  • 勾選自解壓選項

  • 在高級里設置解壓路徑

  • 在高級里添加解壓后生成的快捷方式

  • 至此,點擊完成后壓縮就完成了,使用時雙擊生成的tool_cmd.exe文件即可

  • 解壓完成后,雙擊桌面生成的快捷方式,即可運行程序

總結

至此,全部制作步驟已經完成了。壓縮得到的exe文件便可以交給其他人直接運行了。
后期可以加入自動更新模塊,使項目每次啟動時候檢測服務器端是否有新的版本,並下載新版本的項目jar文件。
  • 制作ico的網址http://www.bitbug.net/
  • exe4j使用指南https://www.jb51.net/softs/577869.html
  • exe4j注冊機下載地址https://www.jb51.net/softs/541579.html

本文為原創,僅代表個人觀點,歡迎大家交流學習


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM