当前位置: 首页 > article >正文

使用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

相关文章:

  • B2109 统计数字字符个数
  • 推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
  • c语言 变量类型总结
  • OpenAI 提示工程指南详解
  • P11233 [CSP-S 2024] 染色 题解
  • axios竟态问题
  • PostgreSQL中vacuum 物理文件truncate发生的条件
  • 牛客题霸-SQL入门篇(刷题记录二)
  • 通过调整报文偏移解决CAN应用报文丢帧或周期过长问题
  • RVA和FOA转换---三
  • 独立维基和验收测试框架 Fitnesse 入门介绍
  • 数据结构与算法Bonus-KNN问题的代码求解过程
  • java15~17 密封类
  • 【JS逆向学习】猿人学第六题 js混淆 回溯
  • 数目之差
  • 【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题
  • upload-labs 0.1 靶机详解
  • 【Spring MVC】Spring MVC拦截器(Interceptor)
  • 《我的AUTOSAR之路》ECUM(二) 唤醒处理
  • 【Java】高级篇1:异常处理
  • 小迪安全42WEB攻防-通用漏洞文件包含LFIRFI伪协议
  • python 深度学习的学习路径
  • 机器学习----特征缩放
  • Mysql增删改查(详解)
  • 摄影第一课
  • java 程序连接 redis 集群 的时候报错 MUTLI is currently not supported in cluster mode