场景
框架启动需要证书,不同环境配置和证书不一致,原本打算用外部配置启动的方法解决,但是受限于框架,无法采用外部配置。那么每次打包时我们都需要去修改项目配置与证书(想想就难受),所以最好是打包的时候自动替换配置,省去人工干预这个步骤。
命令
了解一下 Windows 脚本涉及的几个指令
copy :将一份或多份文件复制到另一个位置。
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ ...]] [destination [/A | /B]]
source 指定要复制的文件。
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D 允许解密要创建的目标文件
destination 为新文件指定目录和/或文件名。
/V 验证新文件写入是否正确。
/N 复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y 不使用确认是否要覆盖现有目标文件
的提示。
/-Y 使用确认是否要覆盖现有目标文件
的提示。
/Z 用可重新启动模式复制已联网的文件。
/L 如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。
命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批处理脚本中执行的,默认值应为
在覆盖时进行提示。
要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。
xcopy: 复制文件和目录树。
XCOPY 源 [目标] [/A | /M] [/D[:d ate]] [/P] [/S [/E]] [/V] [/W]
[/C][/I][/Q][/F][/L][/G][/H][/R][/T][/U]
[/K][/N][/O][/X][/Y][/-Y][/Z][/B][/J]
[/排除:file1[+file2][+file3]...][/压缩]
源 指定要复制的文件。
目标 指定新文件的位置和/或名称。
/A 仅复制具有存档属性集的文件,
不更改属性。
/M 仅复制具有存档属性集的文件,
关闭存档属性。
/D:m-d-y 复制在指定日期或之后更改的文件。
如果未给定日期,则仅复制那些
源时间比目标时间新的文件。
/排除:file1[+file2][+file3]...
指定包含字符串的文件列表。 每个字符串
应位于文件的单独行中。 当任意
字符串与要复制的文件的绝对路径的任意部分
匹配时,将从复制中排除该文件。 例
如,指定 \obj\ 或 .obj 等字符串将排除
目录 obj 下的所有文件或所有具有
.obj 扩展名的文件。
/P 创建每个目标文件之前会提示你。
/S 复制除空目录和空子目录之外的目录和子目录。
/E 复制目录和子目录,包括空目录和空子目录。
与 /S /E 相同。可用于修改 /T。
/V 验证每个新文件的大小。
/W 提示你在复制前按键。
/C 即使出现错误也继续复制。
/I 如果目标不存在,且正在复制多个文件,
则假定目标必须为目录。
/-I 如果目标不存在,且正在复制单个指定文件,
则假定目标必须为文件。
/Q 复制时不显示文件名。
/F 复制时显示完整的源文件名和目标文件名。
/L 显示要复制的文件。
/G 允许将加密文件复制到
不支持加密的目标。
/H 同时复制隐藏文件和系统文件。
/R 覆盖只读文件。
/T 创建目录结构,但不复制文件。不
包括空目录或空子目录。/T /E 包括
空目录和空子目录。
/U 仅复制已存在于目标中的文件。
/K 复制属性。普通 Xcopy 将重置只读属性。
/N 使用生成的短名称进行复制。
/O 复制文件所有权和 ACL 信息。
/X 复制文件审核设置(表示 /O)。
/Y 取消提示以确认要覆盖
现有目标文件。
/-Y 导致提示以确认要覆盖
现有目标文件。
/Z 在可重启模式下复制网络文件。
/B 复制符号链接本身与链接目标。
/J 使用未缓冲的 I/O 进行复制。建议用于非常大的文件。
/压缩 文件传输期间请求网络压缩(如果
适用)。
/稀疏 在复制稀疏文件时保留稀疏状态。
可以在 COPYCMD 环境变量中预设开关 /Y。
这可能在命令行上被替代为 /-Y。
jar :操作 jar 文件
用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。
示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并
将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/ .
tar :操作存档文件
Usage:
List: tar -tf <archive-filename>
Extract: tar -xf <archive-filename>
Create: tar -cf <archive-filename> [filenames...]
Help: tar --help
第一个选项必须是模式说明符:
-c 创建 -r 添加/替换 -t 列表 -u 更新 -x 提取
常用选项:
-b # 每个I/O块使用#512字节的记录
-f <filename> 存档位置 (默认 \\.\tape0)
-v 详细
-w 互动
创建: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
<file>, <dir> 将这些项目添加到存档
-z, -j, -J, --lzma 使用gzip/bzip2/xz/lzma压缩存档
--format {ustar|pax|cpio|shar} 选择存档格式
--exclude <pattern> 跳过与模式匹配的文件
-C <dir> 在处理剩余文件之前更改为<dir>
@<archive> 将<archive>>中的条目添加到输出
列表: tar -t [options] [<patterns>]
<patterns> 如果指定,则仅列出匹配的条目
提取: tar -x [options] [<patterns>]
<patterns> 如果指定,则仅提取匹配的条目
-k 保留(不覆盖)现有文件
-m 不恢复修改次数
-O 将条目写入stdout,不要恢复到磁盘
-p 还原权限(包括ACL、所有者、文件标志)
bsdtar 3.5.2-libarchive 3.5.2 zlib/1.2.5.f-ipp bz2lib/1.0.6
脚本编写
以 test.jar 为例,替换 jar 包中的 license.xml, public.cer, bootstrap.properties,如下图所示

在项目中添加要替换的配置,这里放在 support/configuration 目录下,
注意:内层配置目录 (BOOT-INF)与 jar 包内部目录层级一样, 即:要替换文件的目录层级与jar保持一致

编写 bat 脚本 package.bat , 放在项目最外层,与 support 同级。
@echo off
call mvn -v
if not %errorlevel% == 0 (
echo ======== Please check if Maven's environment variables are configured ========
@pause
exit
)
call mvn clean
echo ======= mvn clean finish ! ========
call mvn package
echo ======== mvn package finish ! ========
call cd target
if exist test.jar (
echo ======== Start replacing configuration ! ========
xcopy ..\support\configuration\BOOT-INF\ BOOT-INF\ /E /Y /F
call jar -uvf test.jar BOOT-INF
echo ======== Replacement configuration completed ! ========
call tar -zcvf test.jar.tar.gz test.jar
if exist test.jar.tar.gz (
echo ======== test.jar.tar.gz package finish ! ========
)
)else (
echo ======== test.jar not found
)
call cd ..
执行
以 IDEA 为例
方式一: 打开 IDEA 的 Terminal 窗口,输入package.bat ,然后执行。
方式二: 在文件夹中找到项目所在位置,在搜索栏输入cmd, 打开命令提示符窗口, 输入package.bat ,然后执行。
至此,就完成了项目的一键打包及配置文件替换,文件仍旧在 target 目录下。
ps:执行脚本需添加 maven 环境变量,否则可能找不到 mvn 命令

文章介绍了如何通过Windows批处理脚本自动替换jar包内的配置文件,如license.xml,public.cer,bootstrap.properties。首先,脚本执行mvnclean和mvnpackage命令来构建项目,然后在target目录下,使用xcopy和jar命令更新jar内的配置,并最终压缩成tar.gz文件。整个过程旨在避免手动修改,提高打包效率。
3436

被折叠的 条评论
为什么被折叠?



