大上周刚刚了结一个桌面软件项目。这个项目需要用到SNMP协议,我刚开始尝试使用不熟的C#,但始终无法ping通目标主机,反而是Java一下就通了,看来还是熟悉的东西比较稳妥。但是用Java的话,大家都懂的~~~(宝宝心里苦啊)

Java 搭建桌面程序不是不可以,而是需要面临很多棘手的问题。软件编写完成后,本来以为大功告成,奈何还要解决编译、打包、如何运行在别人的机器上等等诸如此类的问题,麻烦的要命。这真的要感谢很多前辈的博文,给了我很多启发,帮助我渡过难关。现将自己所经历的一切总结成文,希望可以帮助到各位同仁,大家一起愉快的玩耍岂不美哉(嘿嘿嘿嘿~~~)

文章涉及软件与技术

  • 打包工具:exe4j 6.0【提取码:9vpx】、Inno Setup 5【提取码:64ss】
  • 项目技术选型:JDK1.8(32/64 涉及到使用此软件电脑的版本)DruidCommons3Commons-EmailLombokDbutils
  • 数据库:Access(驱动:ucanaccess)
  • 其它:软件图标(.ico)

文章目录

  • 工程说明
  • 准备工作
  • 导出程序
  • 转换为“.exe”可执行程序
  • 常见BUG总结
  • 拓展
    • jre 瘦身
    • 整个工程打包为安装程序
  • 鸣谢

工程说明

  1. 首先对工程目录做下说明。src目录下,二十几个包,就不打开了。主要说下,为什么有两个resources目录。利用EXE4j将项目打包成.exe后,配置文件会被一起打包,为了实现配置独立,又将resources目录独立出一份。这样做之后,resources文件夹要和.exe可执行程序处于同一文件目录下,程序才能加载到配置文件。当然,也可以在代码中自定义配置文件路径,但那样做之后,可能会在路径问题上耗费较多时间(例如我,log4j日志生成目录弄了半天)
  2. 当前这个工程,我是将log4j配置文件,加入到maven下的resources里面的,但在最后生成时,我是将这个文件,放到外层的resources里,和其它配置文件处于同一目录。这样的原因是,如果在Eclipse里面,直接将log4j配置文件放到外层的resources里面,会出现加载不到该配置文件的情况(我想把这几个配置文件独立出来,所以没有采用默认路径加载,而是自加载的方式),所以在Eclipse里面测试时,log4j配置文件就放在maven管理的resouces下了。只要log4j配置文件可以正常加载,生成日志的文件路径,就不用操心了。
  3. images后期没有改动的需求,一并加入到resources管理

准备工作

  1. Java程序是运行在虚拟机上的,所以别人的电脑要想运行Java程序必须要有Java环境,即jre。而我的程序要运行在32位电脑上,所以就需要准备32位的jre,64位同理;
  2. exe4j软件;
  3. 桌面程序需要软件图标,准备一个ico图片,并不是必要的。

导出程序

  1. 程序右键 --> Export…
  2. 选择“Runnable JAR file(可执行JAR包)”–> next
  3. 配置如下:
“Library handing”:我选择的第一项
  • Extract required libraries into generated JAR:把所有的import JAR都拆开来,包含在JAR的各个目录中,ex. net/org/xxx.class
  • Package required libraries into generated JAR:把所有的import JAR都包在JAR的根目录下
  • Copy required libraries into a sub-folder next to the generated JAR:把所有import JAR放在JAR外面独立的一个文件夹
  • 如果程序依赖于其它包,就在“Library handling”处选择“Package required libraries into generated JAR”或“Copy required libraries into a sub-folder next to the generated JAR”,如果选择后者,导出时,会将需要的包拷贝到一个目录中,后面引用这个JAR包时,必须将这个目录拷到JAR包所在的目录。
  1. 配置完成后,点击“Finish”。如果看到下面的警告不要害怕,只是一个警告而已。提示大致意思是生成的项目有警告(不影响程序运行,但可能是一个未知的隐患)。如果你的代码中有黄色告警,那么到这里,是肯定会弹出这个提示框的。
  2. 不用理会,点击OK!我的输出路径是桌面,快看看。
  3. 这个“jar”已经可以执行了,但那是因为我的机器里有“java”运行环境,复制到别人的电脑上是没用的。现在将它转换为“.exe”可执行程序

转换为“.exe”可执行程序

  1. 在桌面创建一个文件夹,将.ico图标jre(根据自身情况选择)配置文件(上面已经说明了配置文件的情况),放到里面,就想像下图
  2. 开始使用工具EXE4J,启动该软件,来到欢迎页。这里可以选择程序转换“模板”或注册该软件。点击“next”
  3. 第二步,选择如下,next
  4. 配置如下,其中第二项,我的输出位置应该选择第一步创建的文件夹,已经存放了之前准备好的“32位jre”.配置完成,点击next
  5. 配置完成后,点击左侧树状结构“Redirection”
  • “Allow only a single running instance of the application”,表示同一时间只有一个程序可以被启动。即多次点击程序图标,只能运行一个程序窗口。
  1. 这里可以配置程序的日志文件。注意,这个日志和log4j完成没关系,应该是exe4j2将Java控制台输出的日志信息以这种方式输出。该文件生成的日志与.exe程序同级。配置完成后,点击“Version info”
  2. 这里的配置其实可以忽略,有兴趣的可以看看
  3. 如果你的程序是64位,就要勾选它。我的程序运行在32位系统上,不能勾选。
  4. 来到“Java invocation”,先点击右侧的“+”,添加“jar”程序
  5. 这里有个小BUG,弹出的对话框,点击打开路径选择弹窗无效,只能手动录入了~~~~这里选择的,就是我们通过Eclipse生成的jar 文件
  • 点击“OK之后”,回到刚才的窗口,发现多个一条记录,选中它,然后看下图。通过选择可执行jar文件,exe4j就能加载出它包含的所有类,我们就需要选择入口类。
  • 这里可以配置虚拟机参数:-Dfile.encoding=utf-8是设置了utf-8的编码,以防中文乱码;
  1. 接着“next”,来到“JDK”版本选择;
  • 配置好之后,选择“advanced Options”–> “Search sequence”.刚进来是下图这样,不用理这三个家伙
  • 这里是配置jre的。exe4j2最后生成的".exe"要想在别人的电脑上运行,就需要告诉它jre在哪里。这里,当然要填上第一步已经准备好的jre路径。所以,这个配置的意义,就是最后生成的".exe"是要和jre一起打包给别人的,这样".exe"才能找到jre,在别人的电脑上运行。
  • 点击最右侧绿色的“+”就会弹出下图的对话框,选择已经准备好的“32位JRE”
  • 导入自己的“jre”文件后,删除其它三项,特别注意的是,一定要删除JAVA_HOMEJDK_HOME这两个默认配置,因为它会保存你本机的JAVA_HOME地址,给别人用时,就会出现路径找不到的错误;
  1. 跳过第7步,到第8步,可以选择语言
  2. 到这里,点击“next”,第九步自动解析,之后自动来到最后,大功告成!这一系列操作之后,就可以将这一过程,保存为一个模板,用相同的配置快速转换另一个程序了。
  3. 快看看成果吧!如下图。图中没注释的文件,都是我提前放进去的。和工程里的配置文件一样,这样就做到了配置文件分离了!程序启动后,日志文件自动保存到log文件夹中。备注:生成的程序,完美在XP32位系统运行,美滋滋!
  • 启动界面

常见BUG总结

  1. 如果最终生成的程序,放到别人的电脑上无法运行,有一部分原因是下图的路径不对,具体原因我说不明白,我找了很久,只有一篇博客提到了,但那篇博客我找不到了。大体意思就是,不能配置绝对路径,应该使用相对路径。但是我使用绝对路径生成的程序,放到别人的电脑上是可以运行的,所以不清楚他为什么会有这个问题。放在这里给需要的小伙伴。
  • 绝对路径的配置
  • 相对路径的配置: 重要: “程序主文件夹”前,要加..\来表示上级目录,exe4j才能加载到入口类
  1. 打包后的程序报如下错误:就是jre位数不对,程序放在什么系统运行,就使用相应的位数jre即可解决。

拓展

exe 生成是编写Java桌面程序的最重要关卡,通过这道门,以后的事情就简单很多。如果想把事情做到最完美,还可以考虑以下问题。

jre 瘦身

  1. 现在面临的问题是,exe程序很小,才十几M。可jre实在太大了,java8的jre有170M(我滴靠~~)给别人不太方便。jre 的瘦身就成为了一个新的问题(当然,如果不在乎体积大小的,也就不是问题了)
  2. jre 瘦身非常麻烦,我综合了若干博客,让jre缩小了100M左右,再通过压缩软件,最终生成的安装程序只有30M左右,已经是我可以接收的范围了,就没有继续做到极致。做到极致的话,未压缩状态的jre应该可以做到10M以下,但那样需要消耗很多精力,我也就懒得弄了。
相关文章如下(按有效程度排序):
http://www.cnblogs.com/cjdty/p/9057845.html
https://blog.csdn.net/sinat_34820292/article/details/80808126
https://blog.csdn.net/xiaoping8411/article/details/6973887

整个工程打包为安装程序

  1. 想让“.exe”在别人的电脑上运行,就需要“jre”,而且程序还需要其它的配置文件,总不能直接把这些东西打包到一个压缩包直接给人家用吧?不太专业。要想办法弄一个安装程序给人家用,才符合大公司的做派不是?
  2. 我使用的是“Inno Setup 5”,这个软件的教程网上有很多,我也就不再拙述了。

鸣谢

• https://blog.csdn.net/u012454773/article/details/49724127/
• https://www.cnblogs.com/luhan/p/5985360.html

利用 EXE4j 生成 .exe Java Swing程序相关推荐

  1. java应用程序利用Exe4j打包exe文件

     java应用程序利用Exe4j打包exe文件 今天上课给学生介绍利用Myeclipse打jar包和exe文件,随便就随手写了下文档供大家参考,希望对大家有用. 1.      使用简介: 把java ...

  2. AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来

    AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来 cemike@126.com 入手华为MatePadPro平板以后就有把windows台 ...

  3. 解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法...

    在 GTK+/GNOME 3 环境下采用默认的 Adwaita 主题时,Java Swing 程序如果使用本地 GTK+ 主题会出现菜单无边框的 bug,这个问题也可能在其他常用的 GTK+ 主题中出 ...

  4. 利用exe4j生成java的exe文件

    使用集成开发工具IDEA生成jar文件 File->Project Structure 2. Artifacts->加号->JAR->From modules with dep ...

  5. python生成exe运行慢_利用pyinstaller生成exe文件碰到的一些问题及解决方法

    在"开源图像标注工具labelme的安装使用及汉化"这篇博客中,使用pyinstaller将labelme项目的入口python文件main.py打包,生成了main.exe文件, ...

  6. 利用pyinstaller生成exe文件碰到的一些问题及解决方法

    在"开源图像标注工具labelme的安装使用及汉化"这篇博客中,使用pyinstaller将labelme项目的入口python文件main.py打包,生成了main.exe文件, ...

  7. 给java swing程序添加背景音乐或音效

    "在平时做小程序中我们可能会想在程序中加上一些背景音乐和音效,以下是我使用的方法(非本人原创)." 源码如下: package Wuzi;import javax.sound.sa ...

  8. Qt打包生成exe: 无法定位程序输入点

    问题现象 编译完成后,直接执行会提示系统错误:找不到Qt5Gui和Qt5Core.dll等动态库. 解决措施 使用windeployqt.exe打包工具,一次性收集所需要的dll文件,与exe文件一起 ...

  9. idea 使用exe4j生成exe文件并且附带jre运行环境(亲测有效)

    转载地址: https://blog.csdn.net/qq_40794266/article/details/88691936

  10. java swing开发窗体程序开发(一)GUI编程

    Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具 而是需要像QT一样纯代 ...

最新文章

  1. isinstance函数和@staticmethod用法
  2. 机器学习 聚类篇——DBSCAN的参数选择及其应用于离群值检测
  3. linux GCC、GDB、Makefile
  4. 项目使用ts辅助_我如何建立辅助项目并在第一周获得31,000名用户
  5. 设计一个扩展自抽象类geometricobject的新的triangle类_面向对象设计原则之开放封闭原则(开闭原则OCP)...
  6. SyntaxError: Non-ASCII character ‘\xe4‘ in file baseline.py on line 18, but no encoding declared;
  7. hadoop入门手册5:Hadoop【2.7.1】初级入门之命令:文件系统shell2
  8. AndroidStudio:设计一个能在图片上涂鸦的程序
  9. Nexus Indexer 2.0:增量下载
  10. 88年的世界杯历史,用Python带你回顾!
  11. Process terminated
  12. 手机抠图怎么变透明底?这个抠图方法快收藏起来
  13. 昆特牌显示无法连接至服务器,巫师之昆特牌总是显示无法连接网络
  14. oppo r11 r11t解BL锁安装面具magisk详细教程
  15. OpenCV每日函数 thinning函数(细化)
  16. 部编版是什么版本_人教版是部编还是统编
  17. 远道知学院| 名下有很多子公司,每个都要独立申请知识产权吗?
  18. 微信公众平台上可以使用的API接口
  19. python学习 day7_字符串、列表的相关操作
  20. 家里WiFi慢?几招帮你解决

热门文章

  1. 群体优化算法工具箱分享(GA、PSO、CS、GWO、WOA、HHO)
  2. SAE使用以及GPS 的经纬度换算成距离的代码(转载)
  3. 基于Vue3和Nestjs的网上匿名聊天网站的实现
  4. kindle导入电子书方法
  5. 【转】我是一个INFP者
  6. Qt读写Excel--QXlsx合并单元格、文本对齐7
  7. macos支持exfat吗_你需要黑苹果吗?
  8. 南京ibm戴尔笔记本维修
  9. 如何使用云桌面系统提高涉密网络安全性与方便性
  10. 手机软件测试网络延时,网络延迟怎么检测-测试网络是否延迟的方法 - 河东软件园...