前言

本人要将基于Spring Boot + JPA/Hibernate框架写的Swing程序打包为exe可执行文件发布,踩了各种坑,虽然结果不尽人意,但不做点记录感觉对不起自己浪费的时间。

了解jar与exe

Java程序创建出可执行jar包需要满足的是:首先要确定Main Class,即是应用程序的入口,其次是需要Java运行环境。而运行环境本身包括了你在项目的依赖,以及运行java程序所需的环境即JVM。

生成jar包在不同平台有不同方法,这里只给出Intellij IDEA平台的解决方案。

exe4j不支持将jre打包进入exe的,要让你的java变身成为的exe变得可执行,意味着什么呢?你需要告诉最终的exe文件去哪里找jre,exe4j打包是提供了查找jre几个方式:注册表,环境变量,或者某个路径。

当然我打包出来的目的肯定是要拿到没有jre环境的pc下使用,解决方案有两种:

  1. 给电脑jre环境,装jdk(或者说至少要装个jre吧),还要看环境变量,麻烦;
  2. 指定jre相对路径,一起放到一个目录下,虽然不能融为一体,但是可以朝夕相伴嘛,当然你要将她保护起来也行。

创建可执行jar包

打开Project Structure(ctrl+shift+alt+s)——> Artifacts ——> 点加号添加jar ——> From modules with dependecies...,选择程序入口主类,Apply配置完成,生成META-INF/MANIFEST.MF文件,格式是这样的:

1
2
Manifest-Version: 1.0
Main-Class: cn.tsukasalwq.productmanager.ProductmanagerApplication

Main-Class就是我们上面说到的主类,程序入口没错,不过请注意后面使用exe4j转为exe可执行文件时有变动。

因为用的是Maven做项目管理依赖,使用Maven进行jar打包。底部Terminal窗口,目录为当前工作根目录(和pom.xml同级),命令如下,参数-Dmaven.test.skip=true表示排除测试代码后打包,不然有可能失败。

1
mvn clean package  -Dmaven.test.skip=true

不加参数在测试类没问题时候则一切正常,是直接在打开右边的Maven project面板,Lifecycle的双击package相当于执行mvn package命令生成jar包。

等在target文件中生成jar包后,用命令行,或双击执行它,前者可以看到控制台打印的信息。如果没什么差错,创建可执行jar包成功。

1
java -jar  target/spring-boot-scheduler-1.0.0.jar

jar转换为exe文件

前置工作:新建一个目录App,目录下放从jdk下拷贝出来的jre文件夹和之前创建的可执行jar包,相互厮守,记得不要忽略。

打开破解版的exe4j,设置各种参数:如exe名称,输出目录;Executable info下的程序是32位还是64位;Java invocation下添加需要打包的jar包并选择主类,重点了,要选择主类是org.springframework.boot.loader.JarLauncher,而不是我们写的,不过不用担心,这点等我弄清楚原因在更新。设置JRE下的最小jre版本,并将Search sequence下三种jre查找方式删除,添加刚才新建文件夹App下的jre目录,如果与jar包同级,添加完成后显示有.\jre

打包完成后将jre文件夹和exe文件放在同级目录运行即可成功运行。

声明:本站所有文章均为原创或翻译,遵循署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议,如需转载请确保您对该协议有足够了解,并附上作者名 (Tsukasa) 及原文地址