【JAR包打包为EXE】javafx/java项目(适用jdk1.8)通过Gradle插件打包为exe,包含jre,客户机无需安装JDK(含代码)

news2024/12/30 3:04:44

前言:

通常在采用javafx或tornadofx等框架编写的桌面软件后,若要分发给客户机进行使用,就需要先在目标客户机安装合适版本的JDK,对于客户机来说并不需要关注这一步骤,这也增加了多台客户机分发及使用的成本,客户端更关注的是软件功能的使用。

安装JDK环境对于技术人员而言可能较简单,而对于非技术人员或不是很熟练的实施人员,那这一步就成为了对使用该软件的一个很大的阻碍。
本文描述了如何通过gradle插件将java程序打包为exe,打包成为exe后,就可以将打包产物直接上传至客户机,直接运行软件,省去了安装JDK环境的步骤。

另注:
文末附有demo项目已上传至github,可以作为实际打包的参考。
本文所述方法是基于java JDK1.8,其他版本jdk的打包可能不会适用。

常见的将java项目打包为exe的工具有好几种,例如:exe4j,install4j,launch4j,JavaPackager,还有java14之后的Jpackage等。
这些工具经过我查阅文档,对其各有大致的了解,我的目标是随着项目的迭代,一次轻量级的配置后就不用再过多关注打包环节,打包能做到方便、快捷、一键式。所以带界面的软件如exe4j,install4j这样的工具就不再考虑。
经过尝试后发现采用mavan/gradle
插件:JavaPackager,是最简单方便的,可定制性也足够,该插件能够支持桌面系统windows,linux,mac,能随着项目迭代而简单的通过打包命令来得到最新的exe程序,可谓是相当方便了。

一、前置条件

  • 首先确保你的javafx/java项目已经可以打包为jar包,通过java -jar xxx.jar命令就可以运行并使用。
    如果不能正常打包请自行排查问题,同时也可以参考我提供的demo里的jar包打包方式。

  • 项目打包工具使用gradle(maven项目的步骤也基本一样,只不过是通过xml来配置插件)

二、引入插件

打开项目的build.gradle.kts(kts格式gradle脚本教程参考这里),在其中引用插件JavaPackager (版本可以直接用1.7.0,已经经过我的实际使用验证):

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("io.github.fvarrui:javapackager:1.7.0")
    }
}

apply {
    plugin("io.github.fvarrui.javapackager.plugin")
}

以上插件配置后,点一下gradle快捷栏的刷新按钮:Reload All Gradle Project,此时会从mavenCentral下载该插件,以进行下一步的Plugin Task的配置。

三、注册Plugin Task

build.gradle.kts中注册以下名为packageApp的task,作为实际打包的task,
插件配置项的详细描述可参考:JavaPackager#plugin-configuration-properties

tasks.register<io.github.fvarrui.javapackager.gradle.PackageTask>("packageApp") {
	//依赖build task
    dependsOn(tasks.build)

    // mandatory
    //定义main方法所在class
    mainClass = "com.kamjin.packdemo.MyAppKt"
    
    // optional
    //是否生成msi安装软件,直接false就好,不需要安装
    isGenerateInstaller = false
    //是否必须管理员权限运行程序,此处false
    isAdministratorRequired = false
    //打包的目标平台,此处auto,会使用当前系统环境,因为是在windows上开发所以会自动打包的是windows,也可以指定为windows,此外也可指定为其他的平台,如果想同时生成多个平台。可以多注册几个不同名字的当前task即可。例如packageAppByLinux,packageAppByMac
    platform = io.github.fvarrui.javapackager.model.Platform.auto

	//是否包含jre,这个需要选true,打包后将会包含可运行的jre在exe的同目录下
    isBundleJre = true
    //定义当前开发环境的jre目录
    jrePath = file("D:\Program Files\Java\jdk1.8.0_301\jre")
    //打包的软件名称,可以任意自定义比如demo,打成exe后就是:demo.exe
    appName = "demo"
    //需要打到项目里的其他文件,一般来说不需要,因为打为jar包时就已经将那些需要用的资源都打包进去了,如字体图片等,特殊需求时,该选项可以自行定制需要打包进去的文件
//    additionalResources = kotlin.collections.mutableListOf(file("D:\image\abc.jpg"))
}

四、使用插件(打包)

插件定义完成后,可以直接运行注册的task
packageApp task

之后就可以在项目的build/${appName}中找到已经打包好的exe及其他附属文件,如下:
打包产物
demo目录下内容解释:

  • jre 目录为插件配置中指定的本地jre目录的copy
  • libs 目录里包含当前程序运行所有依赖的第三方jar包
  • demo.exe 为实际的windows可运行程序
  • demo.ico 为图标资源,如果没有自定义则默认是一个咖啡图标
  • extra.properties 该配置文件是手动放入的,也可以通过gradle的Copy Task来完成,此处我是为了演示使用外部配置的方式(将extra.properties放在exe程序同级目录下)

这样生成的demo目录下的所有内容,可通过压缩包的方式分发给各客户机,而相关人员直接解压到某个目录下,就可以直接运行使用。

PS: 如果需要更多的资源定制操作,可以自行定制task动作,拷贝资源,文件替换等,可以参考gradle working_with_files,如果需要定制exe资源等操作,参考JavaPackager plugin-assets。

代码地址:

demo代码已上传至github:javafx-gradle-package2exe-demo
该demo项目中包含读取外部及内部配置文件,日志的文件写出,以及exe图标替换范例,采用kotlin+gradle,供实际打包的参考。

结语:

软件开发从来都不是难题,对于给目标客户机的安装和部署,往往才需要更多的精力解决。

另外强烈推荐一下gradle,真的非常好用,定制性足够高,打包脚本可读性很高,主要的重点是gradle的打包速度很快,多模块项目里和maven的对比非常明显,在日复一日的软件开发部署打包环节,能节省大量的时间。再搭配docker-compose或其他编排软件,能大量的提升研发效率。有问题请评论区留言。
随缘更新。再会~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宾语从句it做形式主语的句子

It代替从句作形式主语的常见句型 一、it 代替连词 that 引导的从句作形式主语。 1、it be 过去分词 that 从句: It’s said that Tom has come back from abroad . It was reported that dozens of children died in the accident . 可用于该句型的过去分词还有&#xf…

Qt学习2-Qt Creator新建项目小tips(哔站视频学习记录)

放送两个小tips: 1、MinGW和MSVC的区别 QT学习笔记&#xff08;二&#xff09;&#xff1a;QT MinGW 和 MSVC 编译方式_Leon_Chan0的博客-CSDN博客 2、如何安装QT对应版本的MSVC (1)问题描述&#xff1a;Qt5.12.8支持MSVC2015和MSVC2017&#xff0c;但是系统安装的是Visual…

大数据技术——函数式编程基础

函数定义与使用定义函数最通用的方法是作为某个类或者对象的成员&#xff0c;这种函数被称为方法。其定义的基本语法为&#xff1a;def 方法名(参数列表):结果类型方法体}字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量…

hdfs的读写数据流程

读&#xff1a; &#xff08;1&#xff09;客户端通过DistributedFileSystem向NameNode请求下载文件&#xff0c;NameNode通过查询元数据&#xff0c;找到文件块所在的DataNode地址。 &#xff08;2&#xff09;挑选一台DataNode&#xff08;就近原则&#xff0c;然后随机&…

学习机器学习应该看哪些书籍?

机器学习是一种人工智能技术&#xff0c;它通过利用计算机算法和数学模型&#xff0c;使计算机系统能够自动从数据中学习&#xff0c;从而不断改进其性能。它是一种数据驱动的方法&#xff0c;可以让计算机从经验中学习&#xff0c;而无需明确地编程。具体来说&#xff0c;机器…

python学习——【第一弹】

前言 Python是一种跨平台的计算机程序设计语言&#xff0c;是ABC语言的替代品&#xff0c;属于面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 从这篇…

怎样成为一名黑客:六个方法让你无所不能

黑客这个名字一直是伴随着互联网发展而来&#xff0c;给大家的第一印象就是很酷&#xff0c;而且技术精湛&#xff0c;在网络世界里无所不能。目前几乎所有的公司企业甚至国家相关部门都会争相高薪聘请技术精湛的黑客作为互联网机构的安全卫士&#xff0c;所以黑客也是很多人比…

【老王读Spring Transaction-7】一个数据源的事物管理配置 与 多数据源的事物管理配置

前言 大多数 Spring 应用程序只有一个数据源&#xff0c;只需要一个事务管理器(TransactionManager)。 但是在多个数据源的情况下&#xff0c;我们就需要在一个应用程序中配置多个独立的事务管理器。 我们可以通过 Transactional 的 value 或 transactionManager 属性来指定让…

shell数值计算

P23 回顾shell基础知识 shell执行多条命令 一行内&#xff0c;分号分割多条命令。比如cd /tmp ;echo hello ;cd - 其中cd -为回到此行命令开始前的目录多行echo和转义字符 双引号里输出$n等特殊字符时&#xff0c;实用\转义&#xff0c;来原样输出字符单引号中字符不进行替换&…

ES6的简单使用

1.ES6基本介绍1996 年 11 月&#xff0c;JavaScript 的创造者 Netscape 公司&#xff0c;决定将 JavaScript 提交给标准化组织 ECMA&#xff0c;希望这种语言能够成为国际标准。次年&#xff0c;ECMA 发布 262 号标准文件&#xff08;ECMA-262&#xff09;的第一版&#xff0c;…

Vue表单数据修改与删除

学习来源&#xff1a;视频p6 书接上文 目录页面修改修改对话框视频教程的做法后端提供接口前端调用接口修改完成后提交删除功能后端开设接口前端调用最终成果展示页面修改 将之前的 BookManage 页面的按钮改为想要的功能 可以注意到修改按钮的标签以及绑定了事件 handleClick…

RK3568核心板以太网大数据测试报告-万象奥科

1. 测试对象HD-RK3568-IOT 底板基于HD-RK3568-CORE工业级核心板设计&#xff08;双网口、双CAN、5路串口&#xff09;&#xff0c;接口丰富&#xff0c;适用于工业现场应用需求&#xff0c;亦方便用户评估核心板及CPU的性能。适用于工业自动化控制、人机界面、中小型医疗分析器…

docker环境下docker-compose一键式搭建fastdfs文件存储服务系统

前言 本节内容我们使用docker-compose一键式搭建一套fastdfs服务&#xff0c;实现docker环境下的文件存储服务&#xff0c;在开始本节内容之前&#xff0c;我们需要提前安装好docker和docker-compose环境。fastdfs是一套分布式的文件存储服务系统&#xff0c;主要有tracker和s…

pipenv的基本使用

一. pipenv 基础 pipenv安装&#xff1a; pip install pipenvpipenv常用命令 pipenv --python 3 # 创建python3虚拟环境 pipenv --venv # 查看创建的虚拟环境 pipenv install 包名 # 安装包 pipenv shell # 切换到虚拟环境中 pip list # 查看当前已经安装的包&#xff0…

地方征信平台第2讲:河北省征信

河北省征信有限公司&#xff0c;注册成立于2022年12月25日&#xff0c;注册资本6330万元人民币。股东及持股比例如下&#xff1a;河北省惠信大数据科技服务有限公司、35.1975%。唐山国控集团有限公司、14.22%。石家庄城控投资集团有限责任公司、 10.8215%。石家庄市国有资本经营…

【017】筛选数据并整理(筛选、返回行号、清除全部数据)_#VBA

自动化办公1. 筛选1.1 在某一基础上筛选1.2 多条件筛选2. 返回行号3. 删除某列重复数据4. 删除当页全部数据5. 求和6. 复制黏贴6.1 第一种6.2 第二种6.2 第三种7. 全部数据1. 筛选 主要使用的命名方式如下 ActiveSheet.Range("$A$1:$L$41500").AutoFilter Field:1,…

打电话哪款蓝牙耳机好?打电话好的蓝牙耳机推荐

耳机除了听歌之外&#xff0c;还经常会用到接听电话。很多真正的无线耳机&#xff0c;在宣传页面上&#xff0c;都会着重介绍自己的耳机在降噪、音质方面的性能&#xff0c;以及他们自己的耳机的性能&#xff0c;下面分享几款打电话好的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝…

人机交互设计概述

人机交互的软件工程实践 1.人机交互设计概述 交互设计视图提高产品或系统的可用性和用户体验。他首先研究、了解某类用户的需求&#xff0c;然后再通过设计来满足用户的需求。随着产品和操作变得越来越复杂&#xff0c;越需要用户掌握新技能&#xff0c;因此设计师对如何能帮…

密码学基础(一)常见密码算法分类

一、密码算法分类&#xff1a; 密码算法主要分为三类&#xff1a;对称密码算法、 非对称密码算法、摘要算法。 二、对称密码算法&#xff08;Symmetric-key Algorithm&#xff09; 1、概念 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算…

8Manage PMO:如何借助系统软件解决多项目管理难点

随着企业不断发展壮大&#xff0c;大多数企业不管性质、规模和行业如何&#xff0c;都会同时进行多个项目&#xff0c;这已然成为一个普遍现象。虽然多项目管理可以提高资源利用率&#xff0c;加速项目交付&#xff0c;但同时也会带来一系列的难点。 如何在多个项目之间有效地…