在Linux服务器内,给jar包快速替换其内部文件的脚本
开发时有时会遇到反复调试、需要反复替换某个class,但是整个jar包上传太慢,等jar包很浪费时间的事情。可以写个脚本实现替换个别文件。
代码
创建一个文件,内容为:
#!/bin/bash
# 替换jar包里面的class文件/jar包/yaml等文件
# 用法:./tihuan.sh xxxx.jar A.class B.yaml C.jar ...
if [ -z "$1" ] || [ -z "$2" ]; then
echo Usage: replace.sh xxx.jar xxx.class xxx.class ...
exit 0
fi
jar="$1"
tmpname="temp-jar-${RANDOM}"
unzip -o -d /tmp/${tmpname} "${jar}" > /dev/null
shift 1
for i in ${*}; do
pushd /tmp/${tmpname} > /dev/null
readarray -d '' array < <(find . -name "${i}" -print0)
popd > /dev/null
file_count=${#array[@]}
if [ $file_count -eq 0 ]; then
echo 未找到该文件,忽略
elif [ $file_count -gt 1 ]; then
echo ==========
echo 找到多个文件,请选择需要替换的文件,如需同时替换,使用逗号分隔:
for ((j=0; j<file_count; j++)); do
echo $((j+1)) - ${array[j]}
done
IFS=, read -a pos
for p in ${pos[@]}; do
real_pos=$((p-1))
echo cp "${i}" /tmp/${tmpname}/"${array[real_pos]}"
cp "${i}" /tmp/${tmpname}/"${array[real_pos]}"
done
else
echo cp "${i}" /tmp/${tmpname}/"${array[0]}"
cp "${i}" /tmp/${tmpname}/"${array[0]}"
fi
done
echo 替换完成,重新打包
dir=$(pwd)
newname="$(date +%y%m%d%H%M%S)-${jar}"
pushd /tmp/${tmpname} > /dev/null
zip -0 -r "${dir}/${newname}" * > /dev/null
popd > /dev/null
rm -rf /tmp/${tmpname}
echo
echo 打包完成!请根据需要运行下面命令:
echo
echo "# 替换软件包"
echo /bin/cp "${newname}" "${jar}"
echo /bin/rm "${newname}"
echo
echo "# 清理临时文件"
echo /bin/rm $*
保存为tihuan.sh,然后chmod +x tihuan.sh
,之后可以按代码上方注释、运行代码时的输出提示这两者进行操作了。