zip命令直接替换jar包中的配置文件

需求:将新的bootstrap.properties,覆盖到 jar 包里相同结构层级中。

有人说:有可视化工具可直接拖拽,那请在看一篇文章:

替换文件

你必须遵从此层级,也别尝试别的办法。我问过GPT,没办法的!

先创建文件夹。(注意你是BOOT-INF 而不是WEB-INF)

mkdir -p ./BOOT-INF/classes

看下结构

zanglikun@zanglikundeMacBook-Pro 2024-06 % tree
.
├── BOOT-INF
│   └── classes
│       └── bootstrap.properties
└── 你的.jar

3 directories, 2 files

替换Jar里面的文件到指定位置(不可修改)

因为zip文件也是有层级关系的,所以需要维护相同的层级位置,这样才能做到替换文件!

zip -u 目标.jar 外面的文件 里面的文件
zip -u 目标.jar ./BOOT-INF/classes/bootstrap.properties ./BOOT-INF/classes/bootstrap.properties

替换结果展示

zanglikun@zanglikundeMacBook-Pro 2024-06 % zip -u 目标.jar ./BOOT-INF/classes/bootstrap.properties ./BOOT-INF/classes/bootstrap.properties
updating: BOOT-INF/classes/bootstrap.properties (deflated 59%)

注意,必须要出现最下面一行 updating...... !!!不然就是没替换文件!!!

我曾经遇到过没权限的问题。你只需要 sudo 即可。错误信息如下:

zanglikun@zanglikundeMacBook-Pro-2 jadp % zip -u 你的Jar包.jar ./WEB-INF/classes/application.properties ./WEB-INF/classes/application.properties

zip I/O error: Permission denied
zip error: Could not create output file (你的jar包.jar)

删除Jar里面的文件

zip -d 你的Jar包.jar ./某个文件.xml

解压Jar里面的一个文件

unzip 你的Jar包.jar BOOT-INF/classes/bootstrap.yaml -d .

tree如下:

zanglikun@zanglikundeMacBook-Pro-2 target % unzip 你的Jar包.jar BOOT-INF/classes/bootstrap.yaml -d .
Archive:  你的Jar包.jar
  inflating: ./BOOT-INF/classes/bootstrap.yaml  
zanglikun@zanglikundeMacBook-Pro-2 target % tree
.
├── BOOT-INF
│   └── classes
│       └── bootstrap.yaml
├── 你的Jar包.jar

如果文件不存在,你会遇到:

jar里面只有yaml 没有 yml

zanglikun@zanglikundeMacBook-Pro-2 target % unzip 你的Jar包.jar ./BOOT-INF/classes/bootstrap.yml -d .       
Archive:  你的Jar包.jar
caution: filename not matched:  ./BOOT-INF/classes/bootstrap.yml

实际操作踩过的坑

 zip -u 有时不替换而 zip -0 总是替换的原因

zip -u 选项

  • 功能-u 选项用于更新压缩包中的文件。如果压缩包中已经存在同名文件,zip -u 会检查文件的时间戳和大小,只有当源文件比压缩包中的文件更新(即时间戳较新,或大小不同)时,才会进行替换。
  • 行为:如果你使用 zip -u file.zip file.txt只有在 file.txt 的时间戳比 file.zip 中的同名文件新时,file.txt 才会被替换

zip -0 选项

  • 行为:如果你使用 zip -0 file.zip file.txt,这会将 file.txt 添加到 file.zip 中。如果 file.zip 中已经有同名的 file.txt,它会被替换,因为 zip 会在添加文件时直接覆盖同名文件。
  • 功能-0 选项用于创建一个不压缩的 ZIP 文件。它实际上是设置压缩级别为 0,意味着文件会以原始格式存储,而不会进行压缩。

总结:zip -u 有时不替换而 zip -0 总是替换的原因,主要是由于时间戳和大小的比较。

多场景构建、上线替换的思路

如果你有多个文件替换。你可以参考这个方式。

#!/bin/bash

# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 无颜色

# 定义变量
JAR_FILE="目标.jar"
PROPERTIES_FILE="./BOOT-INF/classes/bootstrap.properties"

# 检查 JAR 文件是否存在
if [[ ! -f "$JAR_FILE" ]]; then
    echo -e "${RED}错误:$JAR_FILE 不存在!${NC}"
    exit 1
fi

# 检查属性文件是否存在
if [[ ! -f "$PROPERTIES_FILE" ]]; then
    echo -e "${RED}错误:$PROPERTIES_FILE 不存在!${NC}"
    exit 1
fi

# 更新 JAR 文件
zip -u "$JAR_FILE" "$PROPERTIES_FILE"

# 检查更新是否成功
if [[ $? -eq 0 ]]; then
    echo -e "${GREEN}成功更新 $JAR_FILE 中的 $PROPERTIES_FILE!${NC}"
else
    echo -e "${RED}更新失败!${NC}"
fi

记录实战

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤

免责声明:
本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。