jar命令的一次实际使用

最近原同事接了一个java的运维支持事项,对方采用spring boot打包,最终在服务器上提供了可执行的jar包运行。由于种种原因,服务器必须进行重做,但更新完成之后发现jar包无法正常执行,最终基于日志分析是api包中使用了sslv3协议去获取企业微信支持功能。而当前微信开放的协议不支持sslv3,并且已经定位到sslv3是在叫底层的api包中已经封装死了。

手上的源码分析确实是是写死了sslv3,但怎么去更新呢?

为了让整个运行项目影响降低到最小。最优方案是只更新协议确认class,其他不进行操作。

根据手上的资源,sslv3调整时是简单的,怎么让调整的class文件放入spring boot 包中成为了难点。

如果是jar的class文件,确实可以使用类似360压缩等工具去更新。但如果是spring boot打包的可执行文件,这种方案就不奏效了。怎么处理呢?

jar的本质是一个zip压缩格式文件,只是在文件的头部修改了文件魔法值,使用jar命令进行打包本质上与zip文件压缩类似。

当我们把原有可执行jar进行解压后,能获取到一个较为标准的spring boot文件目录。把lib中的底层sslv3协议的jar包更新后,执行文件打包命令就可以获取到一个新的jar包。

第一次执行jar -cvf xxxx.jar * ,文件确实正常打包了。更新Manifest文件后,执行java -jar xxxx.jar 启动时,发现新jar内置的jar包无法正常解析。

怎么处理呢?

经过异常分析,jar如果内置了jar文件,打包时不能启动压缩方案。

最终使用 jar -cvf0 xxxxx.jar * 重选打包,更新完Manifest文件后,执行就正常了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Linux 上,你可以使用 cron 来实现定时更新 jar 项目的脚本。 首先,编写脚本文件,例如 update.sh: ``` #!/bin/bash cd /path/to/your/project git pull origin master mvn clean install ``` 然后,设置 cron: ``` crontab -e ``` 在文件末尾添加以下内容: ``` 0 0 * * * /bin/bash /path/to/your/project/update.sh ``` 这样,每天 0 点,系统就会自动执行 update.sh 脚本,更新 jar 项目。 ### 回答2: 为了编写一个定时更新jar项目的脚本,我们可以使用Shell脚本编程语言。下面是一个示例脚本: ```shell #!/bin/bash # 定义要更新的jar包的路径 JAR_PATH="/path/to/your/jar" # 定义定时更新的时间间隔(以秒为单位) UPDATE_INTERVAL=3600 # 每小时更新一次 # 循环执行更新操作 while true; do # 停止当前正在运行的jar进程 PID=$(pgrep -f myapp.jar) if [[ -n $PID ]]; then kill $PID sleep 5 fi # 删除旧的jar文件,并将新的jar文件复制到指定路径 rm -f $JAR_PATH/*.jar cp /path/to/new/jar/*.jar $JAR_PATH # 启动新的jar进程 nohup java -jar $JAR_PATH/*.jar > /dev/null 2>&1 & # 等待更新间隔 sleep $UPDATE_INTERVAL done ``` 这个脚本将会每隔一小时执行一次更新操作。它首先会停止当前正在运行的jar进程(如果有的话),然后删除旧的jar文件,并将新的jar文件复制到指定路径。最后,它会启动新的jar进程来运行更新后的代码。 请注意,你需要将代码中的`/path/to/your/jar`替换为你实际jar文件路径,并将`/path/to/new/jar`替换为你用于更新的新jar文件的路径。 你可以将这个脚本保存为一个.sh文件,并使用`chmod +x script.sh`命令将其设置为可执行文件。然后,你可以使用`./script.sh`命令来运行它。如果你希望脚本在后台运行,并且不受终端关闭的影响,你可以使用`nohup ./script.sh &`命令来运行它。 ### 回答3: 编写一个定时更新jar项目的脚本可以采用Shell脚本来实现。以下是一个示例: ``` #!/bin/bash # 检查项目目录是否存在 if [ ! -d "/path/to/project" ]; then echo "项目目录不存在" exit 1 fi # 切换到项目目录 cd /path/to/project # 备份旧的jar文件 if [ -f "myproject.jar" ]; then cp myproject.jar myproject_$(date +%Y%m%d%H%M%S).jar fi # 下载最新的jar文件 wget -O myproject.jar https://example.com/myproject.jar # 检查下载是否成功 if [ $? -ne 0 ]; then echo "下载最新的jar文件失败" exit 1 fi # 杀死旧的进程 pid=$(pgrep -f myproject.jar) kill $pid # 启动新的进程 java -jar myproject.jar & echo "项目更新完成" ``` 以上脚本实现的功能是,先检查项目目录是否存在,如果不存在则退出,如果存在则进入该目录。 然后,备份旧的jar文件,如果存在的话。 接着,使用wget命令下载最新的jar文件并保存为myproject.jar。 下载完成后,检查下载是否成功,如果不成功则退出。 接下来,通过pgrep命令获取旧的进程的PID,并使用kill命令杀死该进程。 最后,使用java命令启动新的进程,并在后台运行。 在脚本执行完毕后,会输出"项目更新完成"的提示信息。 注意,以上只是一个示例脚本,请根据实际情况修改脚本中的项目目录、jar文件名以及下载链接等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值