传统Java项目转换为可输入参数的exe程序执行

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包时,需要一个一个手动添加。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值