使用exe4j将java项目打包为exe文件(包含普通maven项目打jar包)

目录

  • 背景
  • 实操
    • 普通maven项目打jar包
      • 手动构建
      • 修改pom文件
    • 使用exe4j工具
      • 官网下载
      • 配置
  • 注意事项(锦囊)
    • jdk11没有jre文件夹
    • 生成独立的jre文件夹
    • 🌂经雨者,愿为人遮风挡雨(jdk11直接生成的jre不行)
    • 指定环境
  • 过程总结

背景

    Java项目要放到其他电脑运行,这台运行Java程序的电脑没有jdk,不能直接运行jar文件,那就打成可执行文件—exe文件,这样就可以放在任何电脑上运行了。

    我们知道Java是一种跨平台的语言,设计初衷就是“一次编写,到处运行”,因此它通常编译成字节码(.class文件),然后由Java虚拟机(JVM)解释执行。这意味着Java程序本身并不直接转换成特定于操作系统的二进制可执行文件,如Windows的.exe文件。这个时候需要一些工具帮助创建包含Java程序及其运行时环境的.exe文件,以便在没有安装Java的Windows系统上运行。

实操

普通maven项目打jar包

手动构建

    普通的Maven项目,手动构建并生成jar包,可以按照以下步骤在IntelliJ IDEA中进行操作:
1、在 IntelliJ IDEA 中,选择菜单栏中的 “File” -> “Project Structure” 进入项目结构设置界面。
在这里插入图片描述
2、在左侧菜单中选择 “Artifacts”,然后点击加号(+)选择 “JAR” -> “From modules with dependencies”。
在这里插入图片描述

3、在弹出的窗口中,选择你的项目模块作为主类,并确保 “Extract to the target JAR” 选项被选中。点击 “OK” 完成设置。
在这里插入图片描述
4、在 “Output Layout” 面板中,可以看到刚刚添加的 JAR 配置。
在这里插入图片描述
5、选择 “Build”,这将会触发构建过程。在这里插入图片描述在这里插入图片描述
6、构建完成后,你可以在项目目录下的 “out” 目录中找到生成的 jar 文件。
在这里插入图片描述

运行jar包

在这里插入图片描述

修改pom文件

使用 Maven Shade 插件来构建可执行的 JAR 文件并指定其中的主类。

 <build>
        <finalName>ChatApp-1.0-SNAPSHOT</finalName><!-- 定义了导出的 JAR 文件的名称 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>org.example.AwtChatAppVersion3</mainClass>
                                    <!-- 主类的位置,例如上图文件,主类配置应为: -->
                                    <!-- <mainClass>top.nihilwater.App</mainClass> -->
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

如果不在pom.xml中添加上述代码,默认生成的是不含有第三方依赖的jar包
    这是因为在使用 Maven 构建 Java 项目并生成可执行的 JAR 文件时,通常情况下需要确保 JAR 文件包含了所有必要的依赖项,并且能够正确识别和执行主类。如果没有添加合适的配置,有时候生成的 JAR 文件可能会缺少依赖项或者无法正确识别主类,导致无法直接通过 java -jar 命令来运行。
添加的Maven Shade 插件的作用就是解决这个问题,它可以将项目的所有依赖项打包到一个 JAR 文件中,并且通过配置指定 JAR 文件的主类,从而使生成的 JAR 文件可以独立运行。添加上述代码块,特别是指定了主类的配置,可以确保生成的 JAR 文件包含了所有依赖项,并且能够正确地执行指定的主类。

接下来,就是使用maven命令打jar包了
在这里插入图片描述
打完之后在target目录下会出现打好的jar包
在这里插入图片描述

使用exe4j工具

exe4j是一个用来将Java应用程序打包成Windows可执行文件(.exe)的工具。

官网下载

链接: exe4j下载
选择对应版本

配置

1、填写秘钥
在这里插入图片描述
在这里插入图片描述
秘钥可以在下面选一个

A-XVK258563F-1p4lv7mg7sav
 
A-XVK209982F-1y0i3h4ywx2h1
 
A-XVK267351F-dpurrhnyarva
 
A-XVK204432F-1kkoilo1jy2h3r
 
A-XVK246130F-1l7msieqiwqnq
 
A-XVK249554F-pllh351kcke50
 
A-XVK238729F-25yn13iea25i
 
A-XVK222711F-134h5ta8yxbm0
 
A-XVK275016F-15wjjcbn4tpj
 
A-XVK275016F-15wjjcbn4tpj

2、选择jar包类型
在这里插入图片描述
3、设置项目名称以及生成的exe放置的位置
在这里插入图片描述
4、可执行文件信息
我的程序是GUI程序,根据自己的程序选择程序类型(还有控制台和web)
在这里插入图片描述
在这里插入图片描述
5、设置要导入的jar包,以及启动类
在这里插入图片描述
选择完之后的结果
在这里插入图片描述
6、设置jdk版本范围
在这里插入图片描述
重要:设置jre位置(是从环境变量中读取还是读取同一文件夹下的jdk)
点击上面截图上的高级选项

在这里插入图片描述
    先说说,这一步的目的,是为了让生成的 EXE文件可以在任何计算机上运行,而无需安装jdk,如果没有这个需求,此处可以直接点击 Next。
在这里插入图片描述

    这样做的目的是让生成的 EXE 根据本操作系统的环境变量来寻找 JRE。如果以后更改了相应的环境变量,则此 EXE 文件因为找不到jre,而运行失败。

接着上面继续说,如果希望生成的 EXE 能在其它计算机中运行,则需要进行如下操作。
在这里插入图片描述
在这里插入图片描述
    注意这里的写法.\jre,代表的是同级目录下的jre文件夹(这里是相对路径),这里就是告诉你要把你的项目运行需要的jre文件夹放到项目输出的文件夹下,放一起的目的就是“走到哪带到哪”,结伴同行,如果是jdk1.8,你的jdk目录下会带有jre文件夹,直接复制到你的exe输出文件夹里就可以了,这句如果不懂,就往下看图
在这里插入图片描述
两个放到一起
在这里插入图片描述
注意:如果你和我一样是jdk11,那jre文件夹去哪弄呢,关于这点请看最后的=锦囊
在这里插入图片描述
后面一路next
在这里插入图片描述
7、最后到你的文件夹下双击exe文件运行在这里插入图片描述
在这里插入图片描述

注意事项(锦囊)

    如果你想要你的exe文件放哪台电脑都可以运行,就得把jre一起打包。当把JRE与exe文件一起打包时,可以将其比作一个移动的咖啡店。咖啡店内部已经准备好了所有所需的设备和材料,包括咖啡机、研磨器、咖啡豆等等。这样无论在哪台电脑上打开这个移动咖啡店(运行EXE文件),它都能够自给自足地运行,因为它已经带有了自己所需的全部环境(JRE)。

    就像移动咖啡店不需要依赖特定地点的设备或供应商,exe文件携带了JRE就可以在任何计算机上运行,而不受计算机本身是否安装了Java运行环境的限制。这种打包方式使得程序能够更加便捷地在不同的计算机上使用,就像移动咖啡店可以随时随地为人们提供美味的咖啡一样。

上面最重要的一点就是把jre文件夹放到exe文件的同级目录下。那问题来了:

jdk11没有jre文件夹

    从 JDK 9 开始,Oracle 不再提供单独的 JRE(Java Runtime Environment)安装包,而是将 JRE 的功能整合到 JDK(Java Development Kit)中。因此,在 JDK 11 中没有单独的 JRE 文件夹。运行 Java 应用程序,只需安装 JDK 即可,它包含了 Java 编译器和运行时环境。

生成独立的jre文件夹

    可以使用 JDK 中的工具来生成一个自定义的 JRE

    打开命令行终端,并导航到 JDK 的安装目录。也可以直接在jdk目录下cmd,运行以下命令来生成自定义的 JRE:

bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre

这个命令的作用是使用 jlink 工具根据指定的模块路径、要添加的模块以及输出目录来创建一个包含指定模块的自定义 JRE
在这里插入图片描述
在这里插入图片描述
    生成了jre文件夹,把文件夹放到项目的exe文件的同级目录下

🌂经雨者,愿为人遮风挡雨(jdk11直接生成的jre不行)

jdk8下面的jre文件夹直接复制一点问题没有,但是jdk11生成的jre文件夹复制之后运行失败,报错截图
在这里插入图片描述
    查了很多文章,各种方法就不在这里说了,直接说我的解决办法,直接把我电脑上安装的jdk11文件夹改名成jre,然后复制到exe文件的同级目录下,问题解决
说下原因,和我这么做有哪些不好,如何做更好

    使用jlink来创建一个自定义的JRE时,实际上是在创建一个包含指定模块的最小化运行时环境。这个过程会排除JDK中不必要的部分,仅保留运行应用程序所必需的组件。

    使用exe4j时,需要指定一个JRE来运行应用程序,因为.exe文件本身并不包含Java运行时环境。通常,可以使用一个已经安装好的JRE,或者提供一个和.exe文件同级的JRE。

    但是问题出现在我使用jlink生成的JRE和直接复制JDK作为JRE之间的差异上。jlink生成的JRE是精简版的,只包含了指定的模块和它们依赖的模块。如果应用程序使用了jlink没有包含的模块或类,那么在运行时就会出现java.lang.NoClassDefFoundError或java.lang.ClassNotFoundException错误。

    而我直接复制JDK作为JRE时,应用程序能够访问JDK中所有的模块和类,虽然运行成功了,但是,这并不是一个好的做法,因为JDK包含了大量的开发工具和库,它们并不适合随应用程序一起分发,这会增加应用程序的大小和潜在的安全风险。

正确做法:(当程序规模大时,考虑性能时,应该按照正确的来)
    是使用jlink来创建一个自定义的JRE,并确保应用程序只使用了jlink所包含的模块。为了做到这一点,

    需要确定应用程序使用了哪些Java模块。可以通过查看应用程序的依赖关系和代码来确定这一点。
    使用jlink命令来创建一个包含所有必需模块的JRE。例如:

jlink --module-path /path/to/jdk-11/jmods --add-modules java.base,java.desktop,...其他模块... --output jre

在–add-modules参数后面,列出应用程序需要的所有模块。

    如果不确定应用程序使用了哪些模块,需要查看Java文档或源代码来确定这一点。此外,还可以尝试使用jdeps工具来分析应用程序的模块依赖关系。

指定环境

    再说一个我遇到的报错,开始我并没有想把jre和exe放在一起,想指定电脑上的jre(开始目光短浅),然后遇到了一个报错
在这里插入图片描述
信息提示的很明显
解决办法:需要单独设置一下环境变量,打开环境变量,如图新建
在这里插入图片描述

过程总结

    总结一下使用exe4将Java程序打包成.exe文件的基本步骤:

1、编写和测试Java程序
首先,需要编写并彻底测试你的Java程序,确保它在命令行或IDE中能够正确运行。

2、准备JRE
由于.exe文件需要包含运行Java程序所需的JRE,需要准备一个合适的JRE版本。可以从Oracle官方网站或其他渠道下载JRE安装包,或者使用jlink工具从JDK中创建一个自定义的JRE。

3、使用exe4j打包程序
创建一个新的项目。
选择Java程序的主类(包含main方法的类)。
指定JRE的路径,这可以是下载的JRE安装目录或使用jlink创建的自定义JRE目录。
配置其他选项,如输出目录、程序图标等。
完成配置后,exe4j将生成一个.exe文件。

4、测试生成的.exe文件
在没有安装Java的Windows系统上测试生成的.exe文件,确保它能够正确运行程序。

除了exe4j还有Launch4j也可以实现同样的功能,我没有实验,但是你可以试试哦

❀❀小提示❀❀
依赖管理:如果Java程序依赖于其他库或JAR文件,需要确保这些依赖项也被正确地包含在.exe文件中,或者与.exe文件一起分发。
性能和大小:打包成.exe文件可能会增加应用程序的大小,并可能影响启动时间,因为整个JRE都需要与程序一起加载。
平台兼容性:尽管.exe文件是特定于Windows的,但可以使用类似的方法为其他操作系统创建可执行文件,如Linux的.sh脚本或macOS的.app包。

    java程序打包成exe文件多么普通的一件事,听起来也很简单,但是做的过程却很曲折,这个世界上没有简单的事情,每个看似简单的表面背后,往往隐藏着复杂的细节和需要克服的困难。有时候事情并不像我们想象的那么顺利,做不出来或者遇到困难是很正常的事情。不要过分给自己压力,保持冷静和乐观的心态,相信自己一定有能力找到解决的办法,每一次遇到的问题都是见证成长的过程~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/273260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL中vacuum 物理文件truncate发生的条件

与我联系&#xff1a; 微信公众号&#xff1a;数据库杂记 个人微信: iiihero 我是iihero. 也可以叫我Sean. iiheroCSDN(https://blog.csdn.net/iihero) Sean墨天轮 (https://www.modb.pro/u/16258) 数据库领域的资深爱好者一枚。 水木早期数据库论坛发起人 db2smth就是俺&am…

牛客题霸-SQL入门篇(刷题记录二)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 以下内容是牛客题霸-SQL入门篇剩余的第 21-39 道题目的 SQL 代码答案。 由于涉及到的数据库表较多&#xff0c;因…

通过调整报文偏移解决CAN应用报文丢帧或周期过长问题

偏移原理 报文很多都是周期性发送的&#xff0c;但是如果每条报文都以一开始作为开始计时的时间点&#xff0c;也就是一开始就发送第一条报文&#xff0c;可能会导致CAN堵塞&#xff0c;导致丢帧或者某些报文某一时刻周期过长&#xff0c;就像下图这样&#xff0c;同一时刻CAN…

RVA和FOA转换---三

文章目录 修改初始值RVA和FOA转换RVAFOARVA和FOA的关系 本次内容包含如何修改程序中的初始值&#xff0c;和如何转换内存和文件的地址。 修改初始值 问题&#xff1a; 我们写了一个程序&#xff0c;可以输出一个结果&#xff0c;那么我们可以通过修改PE文件来改变这个输出结果…

数据结构与算法Bonus-KNN问题的代码求解过程

一、问题提出 &#xff08;一&#xff09;要求 1.随机生成>10万个三维点的点云&#xff0c;并以适当方式存储 2.自行实现一个KNN算法&#xff0c;对任意Query点&#xff0c;返回最邻近的K个点 3.不允许使用第三方库(e.g.flann&#xff0c;PCL,opencv)! 4.语言任选(推荐…

【JS逆向学习】猿人学第六题 js混淆 回溯

逆向目标 网址&#xff1a;https://match.yuanrenxue.cn/match/6接口&#xff1a;https://match.yuanrenxue.cn/api/match/6参数&#xff1a;payload(m、q) 逆向过程 老规矩&#xff0c;先来分析网络请求&#xff0c;加密的地方一目了然&#xff0c;没什么可多说的&#xff…

数目之差

解法一&#xff1a; 显然只需让多的在限度内最多即可 #include<iostream> #include<algorithm> using namespace std; #define endl \n void solve() {int n, k, num0 0, num1 0;cin >> n >> k;string s;cin >> s;for (int i 0; i < s.s…

【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题

分类 内容 论文题目 RLHF-V: Towards Trustworthy MLLMs via Behavior Alignment from Fine-grained Correctional Human Feedback 作者 作者团队&#xff1a;由来自清华大学和新加坡国立大学的研究者组成&#xff0c;包括Tianyu Yu, Yuan Yao, Haoye Zhang, Taiwen He, Y…

upload-labs 0.1 靶机详解

下载地址https://github.com/c0ny1/upload-labs/releases Pass-01 他让我们上传一张图片&#xff0c;我们先尝试上传一个php文件 发现他只允许上传图片格式的文件&#xff0c;我们来看看源码 我们可以看到它使用js来限制我们可以上传的内容 但是我们的浏览器是可以关闭js功能的…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

《我的AUTOSAR之路》ECUM(二) 唤醒处理

ECUM唤醒 1 EcuM 唤醒源2 EcuM 唤醒源配置3 Can 通道唤醒源调用解析1 EcuM 唤醒源 AUTOSAR 唤醒过程包含的步骤 检查唤醒源和上报唤醒时间唤醒源保护唤醒过程是独立于 EcuM 休眠阶段的,但是唤醒时间可以用于休眠阶段 在整个 Ecu 所有阶段,唤醒事件都可以存在唤醒不单单指 Ecu …

【Java】高级篇1:异常处理

异常&#xff1a;程序在执行过程中出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 Java的异常抛出机制 Java异常体系 1、Throwable 2、Error和Exception 异常处理方式 1、try-catch-finally&#xff08;捕获异常&#xff09; 基本结构&#xff1a; 使用…

小迪安全42WEB攻防-通用漏洞文件包含LFIRFI伪协议

#知识点: 1、解释什么是文件包含 2、分类-本地LFI&远程RFI 3、利用-配合上传&日志&会话 4、利用-伪协议&编码&算法等 #核心知识: 1、本地包含LFI&远程包含RF1-区别 一个只能包含本地&#xff0c;一个可以远程加载 具体形成原因由代码和环境配置文件决定…

机器学习----特征缩放

目录 一、什么是特征缩放&#xff1a; 二、为什么要进行特征缩放&#xff1f; 三、如何进行特征缩放&#xff1a; 1、归一化&#xff1a; 2、均值归一化&#xff1a; 3、标准化&#xff08;数据需要符合正态分布&#xff09;&#xff1a; 一、什么是特征缩放&#xff1a; 通…

Mysql增删改查(详解)

1.新增 insert into 表名 values 新增字段 。 如图&#xff1a; 这里我一共添加了三条数据。 2.查询 2.1 全列查询 select * from 表名 。 如图&#xff1a; 这里的全列查询可以展示一个表中的全部的数据。 2.2 指定查询 select 要查询的字段名 from 表名 。 比如…

摄影第一课

色彩 红色绿色黄色 红色蓝色洋红 蓝色绿色青色 冷暖色 摄影基础 选择合适的前景&#xff0c;增加照片层次感 测光拍摄&#xff0c;照片有亮和暗的地方&#xff0c;立体感更强 拍摄技巧 拍摄倒影 手机靠近水面&#xff0c;距离越近拍到的倒影越多适当降低曝光、获得更加准…

阳光保险MySQL数据库平稳迁移OceanBase,稳定运营超700天

作者简介&#xff1a; 车东兴&#xff1a;于阳光保险就职&#xff0c;深耕保险行业的 IT 领域长达12 年&#xff0c;对保险领域的基础架构实践有深刻的理解与掌握。熟悉多款数据库&#xff0c;具有丰富的数据库运维经验。 王华城&#xff1a;于阳光保险就职&#xff0c;10多年一…

XDAG节点版本更新(0.6.5升级到0.7.0)

1、拉取最新的xdagj源码 mkdir /root/xdagj-0.7.0 && cd /root/xdagj-0.7.0 git clone https://github.com/XDagger/xdagj.git cd xdagj mvn clean package -Dmaven.test.skiptrue2、创建新的数据目录并解压程序包 mkdir /data/docker-compose/xdagj-7.0/bin -p cd /…

SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法

问题&#xff1a; java: 无法访问org.mybatis.spring.annotation.MapperScan 错误的类文件: /D:/Program Files/apache-maven-3.6.0/repository/org/mybatis/mybatis-spring/3.0.3/mybatis-spring-3.0.3.jar!/org/mybatis/spring/annotation/MapperScan.class 类文件具有错误的…

辐射全国、面向世界、聚焦未来——华为(深圳)全球具身智能产业创新中心正式成立

3月15日&#xff0c;深圳市前海深港现代服务业合作区管理局&#xff08;以下简称“前海管理局”&#xff09;、深圳市宝安区人民政府、华为技术有限公司&#xff08;以下简称“华为”&#xff09;共同签署合作协议&#xff0c;宣布共建华为&#xff08;深圳&#xff09;全球具身…
最新文章