本文將使用exe4j將java項目封裝為可以發送給他人使用的工具為例,來記錄將java項目封裝為exe文件的全過程
編寫java代碼
目標:創建相關java項目代碼,以實現相關功能
-
創建一個java項目,目錄結構如下:
-
代碼如下:
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包執行方式
-
選擇打包配置文件存放目錄
-
右鍵點擊1,創建lib文件夾
-
將第三方jar放入lib,也可以使用maven編譯命令,
dependency:copy-dependencies
將用到的jar包提取出來,復制進lib文件夾 -
點擊jar,設置第三方jar路徑
-
點擊4,進入設置
-
為每個第三方jar添加
lib/
前綴, -
保存
-
編譯打包
-
編譯成功后就可以在上圖的文件接口圖中找到導出的artifacts文件夾
-
得到最終的lib文件夾和jar文件后,在 tool_cmd_jar 文件夾內打開cmd,使用
java -jar tool_cmd.jar
命令即可嘗試執行,一旦可以執行,即可進入下一步操作
詳細打包步驟可參考文章【IDEA如何打包可運行jar的一個問題】
創建exe文件
目標:下載並安裝exe4j,使用exe4j對Java項目代碼創建可運行的.exe文件
-
進行jre環境校驗
-
如果不通過會有錯誤提示,需要調整java jre環境
-
設置jre環境后可以在cmd里執行
java -version
進行測試,如果出現以下打印,則為設置成功 -
打開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
本文為原創,僅代表個人觀點,歡迎大家交流學習