将idea中的JavaFX项目打包成可执行的exe应用_javafx打包成exe-程序员宅基地

技术标签: JavaFx  Java  java  exe  maven  intellij-idea  javafx  

摘要:在打包过程中走了很多弯路,搜索了很多文章一 一实践,踩了很多坑。最终总结出来的个人认为最稳妥的方法。在此记录下来方便大家,方便自己。

本文提供了三种打包exe的方式

如果采用的较新的jdk版本与maven完整配置的依赖包,建议第一种方式。

如果采用像jdk1.8这种旧的版本,且除了maven配置,手动添加过部分依赖包的可以使用第二种方式。

第三种方式JavaPackager为最万能强大的。(建议使用

一、直接利用Artifacts 打包成exe

按照以下步骤添加Artifacts

完成后进行下一步,注意:必须将右边需要的jar包双击添加到左边,否则exe将缺少包无法执行!

 随后进一步配置:Application class中添加项目的启动类,将Native bundle设为all,点击OK

这时,我们可以直接打包了,按照下面方式进行Rebuild。

 

打包成功,exe程序在项目文件的out/artifacts里面。

优点:方便快捷         

缺点:会出现部分jar包执行错误的情况

(我遇见过的情况:exe程序启动后,串口工具包rxtxcomm.jar执行过程中途导致jvm意外崩溃,程序闪退。而在idea中运行项目却可以正常执行)

于是我采用了下面的打包方式

 二:先将项目打包成jar包,再通过exe4j打包成exe

1.打包成jar

这里我建议采用maven的maven-assembly-plugin插件进行打包,原因是:

常用的打jar包方式有idea的Artifacts,maven的javafx-maven-plugin与maven-assembly-plugin。

Artifacts的方式与前面一中提到的打exe包方式类似,缺点也一样。

而maven的两种方式,前者生成两个文件:程序jar包与复制所需的依赖jar包到lib目录,操作比较繁琐,而且在exe4j中进行打包的话会出现Caused by: java.lang.NoClassDefFoundError这种错误,也就是个别依赖jar包导入错误的情况。  后者打包项目与依赖的所有jar包生成单个jar包,操作简单,且不容易出错。

maven-assembly-plugin操作过程:

在POM.XML中加入以下依赖

  <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
              <manifest>
                <mainClass>com.fendo.analysis.AnalysisStart</mainClass>
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
 </plugin>

打开项目下的META-INF文件中的MANIFEST.MF,查看其中的jar包是否完整,可以手动添加配置:例如我的项目中,手动加了RXTXcomm.jar依赖包,并在jre的bin中手动加了它的两个dll文件,这时如果直接打包,将忽略这个jar包导致程序无法执行。这时我们应该在MANIFEST.MF中添加RXTXcomm.jar,也可以在pom.xml里利用标签配置。

 随后打开右方maven,点击m符号。

执行mvn assembly:assembly或install -Dmaven.test.skip=true, 执行成功后会在项目文件的target文件夹下多出一个以-jar-with-dependencies结尾的JAR包. 这个JAR包就包含了项目所依赖的所有JAR的CLASS.

 2.exe4j将jar打包成exe

exe4j的官方下载地址:ej-technologies - Java APM, Java Profiler, Java Installer Builder

使用方式:

软件主页,点击next

 此处选择JAR in EXE mode。上面的Regular mode是 javafx-maven-plugin 打的包选择的。

 输入应用名称,选择exe打包好后的输出地址

 输入exe名称,Icon File为exe的图标,在高级选项中选择64bit

 VM Parameters配置jvm虚拟机的参数(不需要的可省略)

点击右边加号,添加之前打包好的项目jar包,下方红线选择项目的启动类

 下一步配置java运行环境JRE,选择最低最高版本,高级选项中手动添加JRE

 点击加号,选择项目开发使用的jdk(最好使用与开发过程中同一个jdk,因为有些人会有在jre中的bin手动添加dll文件的情况)

!!!切记    将java运行环境jre拷贝到与jar包相同的文件下(输出exe也必须在相同的文件目录下),jre路径采用相对路径.\jre,而非绝对路径。不然在没有安装java jdk的电脑上将无法运行。

exe打包好后,jar包可以删除,有jre与exe即可。

选择使用的虚拟机模式,JVM client模式Server模式启动,分别针对桌面应用和服务器应用做了相应的优化,client版本加载速度较快,server版本加载速度较慢但运行起来较快。Java HotSpot虚拟机默认不带参数启动会首先检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动,而检测的根据是至少2个CPU和最低2GB内存。

 到此处,重点需要配置的已经完成,后面一直点next即可完成打包,有其它配置需求的请根据个人情况而定。

三:JavaPackager 打包exe

超级好用的javafx工程打包工具,支持打包成 LINUX / MACOS / WINDOWS等操作系统应用,支持打包成安装包或者免安装版本,支持打包添加额外的文件资源,通过maven或gradle配置参数信息,相当的方便。

JavaPackager使用前需要提前安装,有很多下载安装的方式,本人是直接下载安装包。

使用详情请参考github:

JavaPackager

配置事例:

    <plugin>
                <groupId>io.github.fvarrui</groupId>
                <artifactId>javapackager</artifactId>
                <version>1.6.6</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>package</goal>
                        </goals>
                        <configuration>
                            <!-- 启动类 -->
                            <mainClass>com.amt.hardwareTest.MainApplication</mainClass>
                            <!-- 绑定自定义JRE路径-->
                            <bundleJre>true</bundleJre>
                            <jrePath>C:\Users\Administrator\Desktop\GD_AmtDriverTool2.2\jre</jrePath>
                            <generateInstaller>true</generateInstaller>
                            <administratorRequired>false</administratorRequired>
                            <!-- 操作系统-->
                            <platform>windows</platform>
                            <copyDependencies>true</copyDependencies>
                            <!-- 名称与版本-->
                            <displayName>AmtHardwareTest</displayName>
                            <name>AmtHardwareTest</name>
                            <version>1.0</version>
                            <!-- 手动引入额外资源-->
                            <additionalResources>
                                <additionalResource>D:\Item\GD_AmtHardwareTest1.0\datas</additionalResource>
                                <additionalResource>D:\Item\GD_AmtHardwareTest1.0\lib</additionalResource>
                            </additionalResources>
                            <!--详细参数配置-->
                            <winConfig>
                                <icoFile>D:\Item\GD_AmtHardwareTest1.0\src\main\ico\app.ico</icoFile>
                                <generateSetup>false</generateSetup>
                                <generateMsi>false</generateMsi>
                                <generateMsm>false</generateMsm>
                            </winConfig>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

执行maven指令打包:

mvn package

四 :exe修改图标

除了上面提到最简单的Icon File引入或者maven配置的方式,还有其它:

    修改exe图标:可以使用软件:ResourceHacker

    可以参考以下文章:

怎么更改exe文件的图标_如何修改EXE文件的图标_cumai3211的博客-程序员宅基地

   修改快捷方式图标:如果图省事,直接修改快捷方式图标就好了

   点击exe鼠标右键创建快捷方式,点击快捷方式鼠标右键点击属性,找到更改图标修改即可

希望文章对大家有所帮助!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29428909/article/details/122103131

智能推荐

火狐插件(开发者)清空缓存-程序员宅基地

文章浏览阅读4.1k次。在火狐游览器的扩展插件中搜索:Clear Cache and Data

用浏览器AXURE RP生成的文件网站,安装Axure-RP-Extension-for-Chrome-程序员宅基地

文章浏览阅读3.3k次。当我们打开AXURE RP生成的文件网站时,一般的浏览器会提示我们使用Google的浏览器,使用了Google浏览器又会提示我们需要安装一个Axure-RP-Extension-for-Chrome插件,但是这个插件时Google提供的,然而现在国内是把谷歌屏蔽了的,所以无法在线正常安装。但是我们可以使用离线安装。下面地址为Axure-RP-Extension-for-Chrome插件的百

laravel自动验证功能抛出问题render处理_laravel 验证抛出error-程序员宅基地

文章浏览阅读2k次。laravel有表单自动验证功能。不用不久可惜了么。但是这对前后台分离的项目不太适配,因为接口错误信息不一致。主要修改错误抛出问题的格式,为了保持给前端的错误信息一致。。修改这个文件。修改这个方法。 public function render($request, Exception $exception) { if ($exception instanceof V..._laravel 验证抛出error

字典树-程序员宅基地

文章浏览阅读105次。4189 字典题目描述最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000)现在skyzhong需要在字典里查询以某一段字母开头的单词如:skyzhong想查询a那么只要是a开头的单词就可以了skyzhong只想知道里面有没有这一个单词(因为没有他就不查了)若有,请输出YES。若没有,请输出NO输入描述..._字典树

【密码学基础】01 密码学基本概念-程序员宅基地

文章浏览阅读5.9k次,点赞10次,收藏53次。密码学基础系列课程第一弹:密码学基本概念_密码学基本概念

java的lazylist的create_java-如何正确使用GreenDao LazyList处理大量数据并进行排序和过滤...-程序员宅基地

文章浏览阅读373次。我正在尝试在android listview中实现分页.背景:我通过网络服务下载了约6万个数据集,并使用GreenDao将其保存到SQLite数据库中.现在,我想在ListView中访问此60k行,然后选择一些(0-10).所选项目将发送到仅包含所选内容的另一个ListView.所有60k条目的db条目约为3 MB.已实施的内容:> SQLite数据库> DAO>列表视图>..._greendao listlazy

随便推点

ASP.NET MVC5 采用Unity(代码和配置文件两种方式)实现IOC_.net mvc unity 配置-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏4次。Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入(Constructor Injection)、属性注入(Property Injection),以及方法调用注入(Method Call Injection).现在Unity最新的版本的1.2版,可以在微软的开源站点http://unity.codeplex.com下载最新的发布版本和文档。通过使用Unity_.net mvc unity 配置

在树莓派上安装vim并配置_在树莓派上编程必备ide-程序员宅基地

文章浏览阅读2.1k次。先安装vim的升级版:sudo apt install vim-gtk然后进入配置文件:vim .vimrc输入以下命令后保存:set numberfiletype onset history=1000set nocompatibleset shiftwidth=4color eveningsyntax onset autoindentset smartindents..._在树莓派上编程必备ide

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨_高德地图 .circleeditor用法-程序员宅基地

文章浏览阅读1.1k次。http://www.cnblogs.com/milkmap/p/3707711.html摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口。除了官方通用的鱼骨、鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib。当然本文还会介绍自定义插件的使用。 --------------------_高德地图 .circleeditor用法

解决移动端line-height不居中问题-程序员宅基地

文章浏览阅读3.2k次。问题:在移动端中使用line-height=height实现文字垂直居中时,在安卓手机会发现文字偏上!解决:1、利用flex布局中的垂直居中属性实现垂直居中,父元素设置display:flex;height:1rem;align-items: center;子元素 transform: scale(0.5); transform-origin: le..._line-height不居中,display:flex不居中

第九届蓝桥杯——第六题-递增三元组_java递增三元组 给定三个整数数组 a = [a1, a2, ... an], b = [b1, -程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏2次。标题:递增三元组给定三个整数数组A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN],请你统计有多少个三元组(i, j, k) 满足:1. 1 &lt;= i, j, k &lt;= N 2. Ai &lt; Bj &lt; Ck 【输入格式】 第一行包含一个整数N。第二行包含N个整数A1, A2, ... AN。第三..._java递增三元组 给定三个整数数组 a = [a1, a2, ... an], b = [b1, b2, ... bn], c = [c1, c2, ... cn], 请你统计有多少个三元组(i, j, k) 满足: 1. 1 <= i, j, k <= n 2. ai < bj < ck 【输入格式】 第一行包含一个整数n。 第二行包含n个整数a1, a2, ... an。 第三行包含n

freeswitch xml_curl模块使用_freeswitch mod_xml_curl 功能-程序员宅基地

文章浏览阅读3.2k次。freeswitch xml_curl模块使用 替换掉directory,ivr,dialplan,等各种本地配置xml文件freeswitch 数据库生成xml文件部分代码 &lt;?php/** * @package FS_CURL *//** * define for the time that execution of the script started ..._freeswitch mod_xml_curl 功能

推荐文章

热门文章

相关标签