简单小记一个java程序启动问题的解决。
目前在使用自行开发的JM管理器,可以便捷管理各种自己写的开发小工具。因为开发时经常要切换线上环境和测试环境进行测试,所以写了一个小App插件【🚲开发环境切换】方便一键切换调试。逻辑很简单,点击按钮修改配置文件即可。
为了简化工具开发难度,所以在App中引入hutool来进行文件的快速读取和写入。插件在我开发的管理器框架基础上搭建没什么难度,只要实现接口协议即可快速装载。
但是当我启动管理器后,运行插件时,却没有反应,赶紧切命令行执行,结果报错未找到hutool。
因为任务管理器是纯净的使用标准jdk包开发的,没有引入其他依赖,所以没有找到hutool。那么要如何装载hutool相关的jar包呢?
为了解决这个问题,很快就想到新增一个lib文件夹用来放置依赖jar包。然后将lib文件夹下的全部依赖装载到classloader中。
一开始脑抽了,想用-Dloader.path来装载lib文件夹下的jar包,执行结果还是同上~稍加思索才反应过来我这个不是一个spring项目,而是单纯的java项目,没有这种配置方式。
所以要装载类只能在java执行时加入进来。于是就写了如下指令
java -classpath libs/* -jar BKPG-1.0-SNAPSHOT.jar
结果惨败,根本原因是没了解过-jar包是直接读取的jar包中配置文件的classpath进行装载的,当有了-jar后,这个-classpath就不生效了。
所以为了能够装载只能有两种方式,其一,在jar包的配置文件中加入libs文件夹的classpath,其二不适用-jar启动。(当然装载类还要其他方式,如自定义classloader等,详细请移步JVM原理)。
我这里就简单的不带-jar执行了。使用如下指令即可成功装载运行插件(-cp 为 -classpath 简写)。
java -cp BKPG-1.0-SNAPSHOT.jar;libs\* top.dreamcenter.bkpg.App
当然了,我们的任务管理器是一个独立的UI界面程序,所以替换java指令为javaw。
javaw -cp BKPG-1.0-SNAPSHOT.jar;libs\* top.dreamcenter.bkpg.App
最终编写bat脚本,放在计算机自动任务中,即可顺利开机启动管理器(注意要先切换路径,否则执行时的上下文路径会变更)。
cd C:\Users\Administrator\Desktop\BKPG_PROj
start javaw -cp BKPG-1.0-SNAPSHOT.jar;libs\* top.dreamcenter.bkpg.App