如何解包和重新打包 WAR 文件
Posted
技术标签:
【中文标题】如何解包和重新打包 WAR 文件【英文标题】:How to unpackage and repackage a WAR file 【发布时间】:2013-10-16 16:33:29 【问题描述】:我有一个 WAR 文件。我想打开它,编辑一个 XML 文件,删除一些 jar,然后重新打包它。
我使用 WINRAR 打开 WAR 文件并删除了一些 Jar,并在 WinRar 中执行了“添加到存档”并创建了一个 WAR。
当我在 jboss 文件夹中部署 WAR 时,出现异常。
16:05:14,316 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2)
MSC00001: Failed to start service jboss.deployment.unit."myapplication.war".
STRUCTURE: org.jboss.msc.service.StartException in
service jboss.deployment.unit."myapplication.war".STRUCTURE:
Failed to process phase STRUCTURE of deployment "myapplication.war"
如何重新打包 WAR?
【问题讨论】:
你注意过用WinRAR创建zip格式吗,因为war文件是ZIP文件的特殊结构。 【参考方案1】:您可以使用此处提到的 java 命令从命令行更新您的战争:
jar -uvf test.war yourclassesdir
其他有用的命令:
解压/分解war文件的命令
jar -xvf test.war
创建war文件的命令
jar -cvf test.war yourclassesdir
例如:
jar -cvf test.war *
jar -cvf test.war WEB-INF META-INF
【讨论】:
@VinothKumar uvf 选项是更新你的战争文件,cvf 选项是创建,xvf 是解压缩或分解。 它不起作用,它没有保持相同的文件结构 我使用以下命令并且它有效:cd [path]/yourclassesdir jar -cvf ../test.war *
v
选项不是执行这些操作所必需的。根据您的喜好,它的输出可能很烦人或有用。来自jar
手册页:v Generates verbose output to standard output.
我通常不喜欢使用详细输出,并且认为区分不必要的详细标志和必要的v
标志是有用的,这些标志意味着除了详细之外的东西。
对某些人来说可能很明显,但仍然......永远不要在实时 Web 容器管理(Tomcat 等)爆炸的 Web 应用程序上运行 cvf
。它将破坏要创建的 WAR 并破坏当前目录。 Web 容器认为这是一个新的 WAR,并删除了您当前正在归档的文件。【参考方案2】:
这对我有用:
mv xyz.war ./tmp
cd tmp
jar -xvf xyz.war
rm -rf WEB-INF/lib/zookeeper-3.4.10.jar
rm -rf xyz.war
jar -cvf xyz.war *
mv xyz.war ../
cd ..
【讨论】:
【参考方案3】:将你的战争文件复制到 /tmp 现在提取内容:
cp warfile.war /tmp
cd /tmp
unzip warfile.war
cd WEB-INF
nano web.xml (or vim or any editor you want to use)
cd ..
zip -r -u warfile.war WEB-INF
现在您已经在 /tmp/warfile.war 中更新了您的文件。
【讨论】:
【参考方案4】:不用了,tomcat自然将war文件解压到同名文件夹中。 您只需修改该文件夹中所需的文件(包括 .xml 配置文件),仅此而已。 从技术上讲,应用修改后无需重新启动 tomcat
【讨论】:
在 tomcat 重新启动时,您的更改将被覆盖。【参考方案5】:根据上述答案,这适用于 Tomcat,但也适用于 JBoss 或任何容器:
sudo -u tomcat /opt/tomcat/bin/shutdown.sh
cd /opt/tomcat/webapps
sudo mkdir tmp; cd tmp
sudo jar -xvf ../myapp.war
#make edits...
sudo vi WEB-INF/classes/templates/fragments/header.html
sudo vi WEB-INF/classes/application.properties
#end of making edits
sudo jar -cvf myapp0.0.1.war *
sudo cp myapp0.0.1.war ..
cd ..
sudo chown tomcat:tomcat myapp0.0.1.war
sudo rm -rf tmp
sudo -u tomcat /opt/tomcat/bin/startup.sh
【讨论】:
我想这就是答案,你可以做两个脚本来提取和打包。【参考方案6】:非编程方式,您只需使用 7zip UI 打开存档即可添加/删除或提取/替换文件,而无需更改结构。直到现在我才知道使用其他东西有问题:)
【讨论】:
不可能,因为它会显示 Operation not supported 您的意思是“不支持的命令”吗?您没有在 7zip 安装目录中选择正确的可执行文件。您需要使用 7zFM.exe(7zip UI 可执行文件)。 WAR 文件和 JAR 文件使用 exact 与 zip superuser.com/questions/274229/… 相同的格式【参考方案7】:也许,您修改了战争的结构或将其部署在不同的服务器版本上。查看这些链接 Error deploying war into JBoss AS 7 (domain mode): "Failed to process phase STRUCTURE of deployment" 和 https://community.jboss.org/thread/199387?start=0&tstart=0&_sscc=t
【讨论】:
【参考方案8】:我确信有 ANT 标签可以做到这一点,但在 .bat 脚本中使用了这个 7zip hack。我使用http://www.7-zip.org/ 命令行工具。我一直使用它来更改 j2ee context.xml 文件中的 jdbc url。
mkdir .\temp-install
c:\apps\commands\7za.exe x -y mywebapp.war META-INF/context.xml -otemp-install\mywebapp
..here I have small tool to replace text in xml file..
c:\apps\commands\7za.exe u -y -tzip mywebapp.war ./temp-install/mywebapp/*
rmdir /Q /S .\temp-install
您可以提取整个 .war 文件(毕竟是 zip)、删除文件、替换文件、添加文件、修改文件和重新打包到 .war 存档文件。但是在大型 .war 存档中更改一个文件可能最好提取特定文件,然后更新原始存档。
【讨论】:
以上是关于如何解包和重新打包 WAR 文件的主要内容,如果未能解决你的问题,请参考以下文章