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博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
