window 替换 jar 包内部配置

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

场景

框架启动需要证书,不同环境配置和证书不一致,原本打算用外部配置启动的方法解决,但是受限于框架,无法采用外部配置。那么每次打包时我们都需要去修改项目配置与证书(想想就难受),所以最好是打包的时候自动替换配置,省去人工干预这个步骤。

命令

了解一下 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 命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值