1.背景介绍
采用springboot框架写了一个定时任务小工具(小工具只是涉及xml报文加工与解密,不涉及数据库)供甲方使用,但小工具逻辑中所需的个别参数:比如盘符名称、定时任务间隔时间等配置在properties文件中,小工具打成可执行jar包后再转换成exe程序供甲方使用。但是不同的甲方对上述的参数要求不同,所以对不同的甲方生成不同的的jar包和exe程序,这样适用性不强,现在抽空对原有小工具项目进行如下优化,但并非想象中那么顺利,特此记事。
2.记事
思路:在小工具exe程序双击启动后,由用户决定运行参数,比如盘符名称、定时任务间隔时间。在main方法中增加new Scanner(System.in)逻辑,获取用户在dos窗口输入的参数,将参数通过构造方法初始化到服务类中,再通过ScheduledExecutorService.scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)的方式启动定时任务来执行服务类。这样就推翻原springboot+@Scheduled注解的定时任务方式,采用传统的Java项目,仍使用maven管理项目。
项目很快重构后,在运行时出现以下问题:
2.1 坑一:使用之前的maven install命令打包jar包后,java -jar 启动jar包时报错“没有主清单属性”,手动在MANIFEST.MF文件中增加Main-Class属性后虽然不报错正常进入main方法逻辑中,但是在后续的逻辑中报错:NoClassDefFoundError。这是因为打包后只打了项目里的逻辑代码class,没有将所依赖的jar包打入lib文件夹内。搜索“maven打jar包的方式”,使用https://blog.csdn.net/puhaiyang/article/details/78380550 里推荐的方法后成功将所依赖的jar包打入lib文件夹内。
2.2 坑二:将打好的jar包和lib放在同一目录后,java -jar 启动jar包,成功启动小工具。使用exe4j工具将jar包转换为exe程序时,在Configure Java invocation-Advanced Options-Native libraries步骤中勾选lib文件夹后,这样转换后的exe程序双击运行发现仍然报错:NoClassDefFoundError。放弃maven install命令的方式进行打包,以下为正确方法:
3.正确方法:
3.1 采用Project Structure-Artifacts-Add jar-From modules with dependencies...的方式进行打包,在输出的out文件夹内有项目代码jar包和所依赖的众多jar包。手动java -jar 执行jar包可成功运行。
3.2 使用exe4j工具时,在Configure Java invocation中点击右侧的+ 号时将所有的jar包都选中,并注意选择正确的jar包里的Main class。这样转换后的exe程序可成功运行。
这种方法唯一的麻烦点就是exe4j选择jar包时,需要一个一个手动添加。