【实用工具】使用Java封装可执行exe应用全过程
本文将使用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
本文为原创,仅代表个人观点,欢迎大家交流学习
【实用工具】使用Java封装可执行exe应用全过程的更多相关文章
- 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)
基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...
- install4j 工具为java程序打包exe
用 install4j 工具为java程序打包exe 制作人:mark 制作时间:2013-05-02 用Eclipse 将程序源码打包成jar文件. 打包jar方法我不做介绍了,相信大家都会,不会的 ...
- Java日期时间实用工具类
Java日期时间实用工具类 1.Date (java.util.Date) Date(); 以当前时间构造一个Date对象 Date(long); 构造函数 ...
- ServiceModel 元数据实用工具 (Svcutil.exe)
ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档 一.SvcUtil.exe ServiceModel 元数据实用工具可在 Windows ...
- IL反编译的实用工具Ildasm.exe
初识Ildasm.exe——IL反编译的实用工具 https://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html 学 ...
- 将Java程序打包成可执行EXE文件的步骤
需要的工具myeclipse .jar2exe(附上下载地址,直接解压就可以用链接: https://pan.baidu.com/s/1qYPRgXu 密码: wbva) 1.将Java项目导出成.j ...
- 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)
本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLAS2015的传送门(http://ictclas. ...
- java Http消息传递之POST和GET两种方法--通过实用工具类来获取服务器资源
实现该方法需要导入一些jar包 可以去一下地址下载: http://pan.baidu.com/s/1hqrJF7m /** * 实用工具类来获取服务器资源 * * get方法传送数据 * * 1.通 ...
- java实现可安装的exe程序
java实现可安装的exe程序 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格式的ja ...
随机推荐
- centos7上以RPM方式安装MySQL5.6
1. 下载MySQL http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.6/ MySQL-5.6.36-1.el7.src.rpm MySQL-5.6.36- ...
- C#/.Net开发入门篇(1)——开发工具安装
众所周知,工欲善其事必先利其器,要想砍柴快一定得有把好刀,那么要想代码写的有效率.质量高一个趁手的编辑器是必不可少的,写代码不可能就用系统自带的文本编辑器(如果是大佬当我没说),这里我推荐各位使用微软 ...
- 【Go 入门学习】第一篇关于 Go 的博客--Go 爬虫初体验
一.写在前面 其实早就该写这一篇博客了,为什么一直没有写呢?还不是因为忙不过来(实际上只是因为太懒了).不过好了,现在终于要开始写这一篇博客了.在看这篇博客之前,可能需要你对 Go 这门语言有些基本的 ...
- Java设计模式之模板方法模式(Template)
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
- [quartusⅡ] 使用quartusⅡ的过程中,遇到过的一些“软件上的问题”
1.USB blaster的驱动在设备管理器上点“更新驱动软件”,更新不了,说什么哈希值不在指定目录下,如下图, 解决方法是,https://blog.csdn.net/rdgfdd/article/ ...
- 关于css中的字体样式
1.决定字体的属性 color:字体颜色 属性值:单词,十六进制表示,rgb 2.字体大小 font-size:12px:属性值是整数字,不要带小数,单位是px叫做像素单位:凡是由像素拼成的图片我们 ...
- VS Code 中使用 GitHub pull request 插件提交代码
VS Code作为一个代码编辑器,受到很多人的喜爱:其中有很多非常有用的插件/扩展功能,也会极大的提高我们的工作效率. 这里介绍一下GitHub pull request,用来向GitHub提交在VS ...
- CSS 技巧一则 -- 在 CSS 中使用三角函数绘制曲线图形及展示动画
最近一直在使用 css-doodle 实现一些 CSS 效果. css-doodle 是一个基于 Web-Component 的库.允许我们快速的创建基于 CSS Grid 布局的页面,以实现各种 C ...
- 使用OpenMP加快OpenCV图像处理性能 | speed up opencv image processing with openmp
本文首发于个人博客https://kezunlin.me/post/7a6ba82e/,欢迎阅读! speed up opencv image processing with openmp Serie ...
- 【Stream—7】NetworkStream相关知识分享
一.NetworkStream的作用 和先前的流有所不同,NetworkStream的特殊性可以在它的命名空间中得以了解(System.Net.Sockets),聪明的你马上就会反应过来:既然是在网络 ...