本文将使用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

本文为原创,仅代表个人观点,欢迎大家交流学习

最新文章

  1. ObjC运行时部分概念解析(二)
  2. ThinkPHP3快速入门教程三:查询语言
  3. AIX 环境下遇到Device Busy问题
  4. Microsoft 2013 新技术学习笔记 一
  5. Java中Scanner的使用方法
  6. 在orangepi-PC下使用pyopengl
  7. html自定义checkbox、radio、select —— checkbox、radio篇
  8. 剪花布条 - HDU 2087(简单KMP | 暴力)
  9. Java中BigDecimal的8种舍入模式是怎样的
  10. sublime搜索和替换--正则
  11. openstack之nova-api服务流程分析
  12. 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
  13. Android 添加水印, 以及屏幕存取
  14. 事件绑定与解除js
  15. shell编程-邮件发送设置
  16. amaze UI 如何添加原生表单验证
  17. RabbitMQ tutorial
  18. ESD总结
  19. Git基础(二) 文件的生命周期
  20. C#网络编程技术SuperSocket实战项目演练

热门文章

  1. git下载安装
  2. 『图论』有向图强连通分量的Tarjan算法
  3. php的精度计算问题(bcadd和bcsub)
  4. 做HTML静态页面时遇到的问题总结
  5. 基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm)
  6. NetCore3.0 文件上传与大文件上传的限制
  7. 在lldb调试中调用c++函数
  8. MachO文件详解--逆向开发
  9. 十二、powerManager
  10. Springboot 系列(十六)你真的了解 Swagger 文档吗?