技术标签: JavaFx Java java exe maven intellij-idea javafx
摘要:在打包过程中走了很多弯路,搜索了很多文章一 一实践,踩了很多坑。最终总结出来的个人认为最稳妥的方法。在此记录下来方便大家,方便自己。
本文提供了三种打包exe的方式:
如果采用的较新的jdk版本与maven完整配置的依赖包,建议第一种方式。
如果采用像jdk1.8这种旧的版本,且除了maven配置,手动添加过部分依赖包的可以使用第二种方式。
第三种方式JavaPackager为最万能强大的。(建议使用)
按照以下步骤添加Artifacts
完成后进行下一步,注意:必须将右边需要的jar包双击添加到左边,否则exe将缺少包无法执行!
随后进一步配置:Application class中添加项目的启动类,将Native bundle设为all,点击OK
这时,我们可以直接打包了,按照下面方式进行Rebuild。
打包成功,exe程序在项目文件的out/artifacts里面。
优点:方便快捷
缺点:会出现部分jar包执行错误的情况
(我遇见过的情况:exe程序启动后,串口工具包rxtxcomm.jar执行过程中途导致jvm意外崩溃,程序闪退。而在idea中运行项目却可以正常执行)
于是我采用了下面的打包方式
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即可完成打包,有其它配置需求的请根据个人情况而定。
超级好用的javafx工程打包工具,支持打包成 LINUX / MACOS / WINDOWS等操作系统应用,支持打包成安装包或者免安装版本,支持打包添加额外的文件资源,通过maven或gradle配置参数信息,相当的方便。
JavaPackager使用前需要提前安装,有很多下载安装的方式,本人是直接下载安装包。
使用详情请参考github:
配置事例:
<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>
mvn package
除了上面提到最简单的Icon File引入或者maven配置的方式,还有其它:
修改exe图标:可以使用软件:ResourceHacker
可以参考以下文章:
怎么更改exe文件的图标_如何修改EXE文件的图标_cumai3211的博客-程序员宅基地
修改快捷方式图标:如果图省事,直接修改快捷方式图标就好了
点击exe鼠标右键创建快捷方式,点击快捷方式鼠标右键点击属性,找到更改图标修改即可
希望文章对大家有所帮助!
文章浏览阅读4.1k次。在火狐游览器的扩展插件中搜索:Clear Cache and Data
文章浏览阅读3.3k次。当我们打开AXURE RP生成的文件网站时,一般的浏览器会提示我们使用Google的浏览器,使用了Google浏览器又会提示我们需要安装一个Axure-RP-Extension-for-Chrome插件,但是这个插件时Google提供的,然而现在国内是把谷歌屏蔽了的,所以无法在线正常安装。但是我们可以使用离线安装。下面地址为Axure-RP-Extension-for-Chrome插件的百
文章浏览阅读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输入描述..._字典树
文章浏览阅读5.9k次,点赞10次,收藏53次。密码学基础系列课程第一弹:密码学基本概念_密码学基本概念
文章浏览阅读373次。我正在尝试在android listview中实现分页.背景:我通过网络服务下载了约6万个数据集,并使用GreenDao将其保存到SQLite数据库中.现在,我想在ListView中访问此60k行,然后选择一些(0-10).所选项目将发送到仅包含所选内容的另一个ListView.所有60k条目的db条目约为3 MB.已实施的内容:> SQLite数据库> DAO>列表视图>..._greendao listlazy
文章浏览阅读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 配置
文章浏览阅读2.1k次。先安装vim的升级版:sudo apt install vim-gtk然后进入配置文件:vim .vimrc输入以下命令后保存:set numberfiletype onset history=1000set nocompatibleset shiftwidth=4color eveningsyntax onset autoindentset smartindents..._在树莓派上编程必备ide
文章浏览阅读1.1k次。http://www.cnblogs.com/milkmap/p/3707711.html摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口。除了官方通用的鱼骨、鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib。当然本文还会介绍自定义插件的使用。 --------------------_高德地图 .circleeditor用法
文章浏览阅读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不居中
文章浏览阅读5.6k次,点赞3次,收藏2次。标题:递增三元组给定三个整数数组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。第三..._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
文章浏览阅读3.2k次。freeswitch xml_curl模块使用 替换掉directory,ivr,dialplan,等各种本地配置xml文件freeswitch 数据库生成xml文件部分代码 <?php/** * @package FS_CURL *//** * define for the time that execution of the script started ..._freeswitch mod_xml_curl 功能