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

如何从bash替换war文件的清单?,bash,jar,zip,war,Bash,Jar,Zip,War,我在当前工作目录中有一个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.wa

我在当前工作目录中有一个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才会替换文件。“足够新”到底意味着什么,我还不清楚
  • 我使用unzip-p foo.war META-INF/MANIFEST.MF>test从zip中提取MANIFEST.MF文件
  • 我使用diff的退出代码来验证MANIFEST.MF是否真的被替换了
  • zip发出警告:“zip警告:本地条目CRC与CD:META-INF/MANIFEST.MF不匹配”我不清楚此警告的含义
  • 我真的必须将MANIFEST.MF放在META-INF文件夹中吗?或者是否有可能指定应该替换的文件的源位置
  • 我不喜欢那种“触摸”。有没有一种方法可以在不修改时间戳的情况下强制进行替换
  • 那么字符编码、不寻常的文件名和行尾呢

这不起作用:我收到zip警告:名称不匹配:foo/META-INF/MANIFEST.MFunzip-l foo.war只是列出了war中的所有文件,如果替换了MANIFEST-MF文件,我就看不到这种情况。如果我使用zip-f foo.war META-INF/MANIFEST.MF,命令不会发出警告,但它不会替换文件。为了验证我使用了unzip-p foo.war META-INF/MANIFEST.MF>MANIFEST.MF。zip的
-f
选项仅在文件已被修改或具有更新的时间戳时才会替换该文件,您必须从生成war文件的同一目录运行它。我以为你想用新文件替换它。这就是为什么我建议使用
解压-l
来验证它,目的是检查时间戳。如果它不起作用,很抱歉。我看到你在评论。您是否尝试过建议使用
jar
命令的答案?我查看了jar文档。之后,我假设jar做了更多我想要的事情(它能够创建一个清单文件),我不知道如何禁用该功能。我不清楚jar是否只针对真实的jar文件,或者它是否也可用于war文件(war、ear和jar文件有不同的规范)。