如何从 bash 替换 war 文件的清单?

How to replace the manifest of a war file from bash?

我的当前工作目录中有一个 war 文件 foo.war。我也有一个 MANIFEST.MF 文件。

ls .
foo.war MANIFEST.MF

在foo.war中,有一个文件foo/META-INF/MANIFEST.MF。 我想用我的工作目录中的文件替换 war 中的那个文件。 我认为 zip 可以用来做这个,但我不明白 zip 文档。

正确的用法是什么?

我如何验证它是否正确完成?

我将如何使用 jar 来做到这一点?

尝试将 MANIFEST.MF 放在名为 foo/META-INF/

的目录中

然后 运行:

zip -f foo.war foo/META-INF/MANIFEST.MF

验证文件运行:

unzip -l foo.war

对 .jar 文件使用相同的方法

经过一段时间的试验,我找到了这个解决方案:

#! /bin/bash

set -e

apt-get install -y zip
apt-get install -y unzip

rm -f foo.war
cp foo.original.war foo.war
touch META-INF/MANIFEST.MF

zip -f foo.war META-INF/MANIFEST.MF

rm -f test

unzip -p foo.war META-INF/MANIFEST.MF >test

#Uncomment next line to test verification:
#echo "X" >>test

if diff test META-INF/MANIFEST.MF; then
  echo "OK."
else
  ERR=$?
  echo "Failed (diff exit code $ERR)."
  exit 1
fi
  • zip 似乎仅在时间戳足够新时才替换文件。 "new enough" 到底是什么意思,我还是不清楚。
  • 我使用 unzip -p foo.war META-INF/MANIFEST.MF >test
  • 从 zip 中提取了 MANIFEST.MF 文件
  • 我使用 diff 的退出代码来验证 MANIFEST.MF 是否真的被替换了。
  • zip 发出警告:"zip warning: Local Entry CRC does not match CD: META-INF/MANIFEST.MF" 我不清楚这个警告的含义。
  • 我真的必须将 MANIFEST.MF 放入 META-INF 文件夹中,还是可以指定应替换文件的源位置?
  • 我不喜欢那样 "touch"。有没有办法在不修改时间戳的情况下强制替换?
  • 字符编码、不常见的文件名和行尾怎么办?