github:https://gitee.com/forgot940629/win-tool-demo
本地启动,查看http://127.0.0.1:8080/form
场景
在日常工作中可能需要后端开发者开发一些辅助工具。这些辅助工具通常希望能想其他软件一样在桌面系统运行,并且有一些桌面应用的基本功能(可视化页面,配置文件,日志)。与其他应用程序最大的不同是,这种小工具只在很小范围内的开发者之间使用,通常情况下使用者都是开发者的同事。所以对可靠性要求不会特别高(毕竟不是给客户使用),对页面美观或者交互逻辑也没有很高要求,但是需要在较短的时间内实现相应功能。
本篇文章针对上述场景提供了一个demo(代码链接在最上面),便于有类似场景的java后端开发者可以快速构建出一些小工具。需要使用者有一定的spring使用经验,能够写一点前端代码。
问题
问题 | 详述 |
---|---|
交互 | 工具如何与使用者交互?命令行交互还是可视化页面?如果是可视化页面选择什么技术展示页面? |
错误 | 软件出问题时如何排查错误?如何让用户感知到错误? |
配置 | 很多东西不能写死在程序中,不能有一点改动就需要重新编译发布。需要有一种方式可以加载配置文件 |
发布 | 使用者可能没有开发者相同的运行环境,所以需要一种方式让没有相应运行环境的用户也可以使用此工具 |
方案
方案概述
问题 | 方案 |
---|---|
交互 | 后端使用thymeleaf编写页面,程序运行之后用户可在浏览器上进行相应操作 |
错误 | 可视化页面中打印错误日志,程序运行时在某个文件中记录运行日志 |
配置 | 将工作目录下特定名称的作为配置文件 |
发布 | 使用jpackage将可执行的jar包打包成安装包,用户可通过此安装包安装程序 |
方案选择的原因
交互
交互的实现方案首先要考虑我会什么。我不想为了开发一个小工具而去学习其他知识,没那么多时间。所以我在方案选择上只考虑了vue和thymeleaf。最终导致我抛弃vue的原因是vue好像要单独启动一个进程去提供前端页面服务(我在github上看了下halo这个项目中对于vue和thymeleaf的使用),而thymeleaf和后端应用都在一个进程,启动spring之后直接就可以在浏览器上看到thymeleaf的页面。所以选择了thymeleaf。
选用thymeleaf更多的原因是我在这方面了解的确实不多,如果有其他好用的且好学(最好也是用html+js/ts编写页面)的工具,辛苦大佬们告知下。
错误
web服务中,错误一般通过两种形式展示出来,一种是通过页面弹窗告知客户,另一种是通过后端日志或者后端报警告知相关运维人员。
作为一个小工具,不需要连接报警平台,但是需要日志文件记录运行状况。同时为了让用户能在页面感知到相应错误,我决定使用文本框展示错误信息,每次新增的错误信息都追加到"运行日志"这个文本框中。
相比于弹窗,文本框有两点好处,一个是可以展示更多的错误细节,甚至可以把报错堆栈打印到文本框上(因为使用者通常也是程序员,所以打印报错堆栈可能更有助于使用);另一个好处是文本框有对历史报错信息的保留,如果是弹窗的话可能报错信息一闪而过,于是就只能F12中一条条翻看请求寻找报错信息。
配置
我能想到的最直接的设置配置文件的方式就是让程序去某个绝对路径找配置文件,比如"C:\config.properties"。但是如果所有小工具都是这么加载配置文件,那么不同的工具直接可能会共用一个配置文件,会造成一些问题。比如不能同时使用多个工具,因为多个工具之间会抢占端口。
所以我希望配置文件可以与程序在同一个文件夹。
为了实现这一目的,我调用System.getProperty("user.dir")
获取当前工作目录(这个当前工作目录实际上就是程序安装之后exe文件所在目录,后续会介绍如何生成安装包),然后在当前目录下找"config.properties"这个文件并加载。
发布
D:\software\jdk17\java\bin\jpackage.exe --win-dir-chooser --name PhoneNumberGeo --main-jar demo-0.0.1-SNAPSHOT.jar --input .\ --type exe
Tips
安装时尽量不要在C盘下,如果一定要安装到C盘下也尽量不要放到"Program Files"这个文件夹下,jpackage默认安装路径就是这个文件夹,但是我安装到这个文件夹下之后总是会出现奇怪的问题,比如日志不全或者配置文件加载错误。
待解决的问题
程序运行时没有图标,只能通过任务管理器关闭程序