【问题标题】:How to unpackage and repackage a WAR file如何解包和重新打包 WAR 文件
【发布时间】: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文件的特殊结构。

标签: java maven web-applications jboss7.x war


【解决方案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】:

      【讨论】:

        【解决方案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 存档中更改一个文件可能最好提取特定文件,然后更新原始存档。

        【讨论】:

          猜你喜欢
          • 2010-10-15
          • 1970-01-01
          • 1970-01-01
          • 2011-09-15
          • 2011-10-17
          • 1970-01-01
          • 2017-07-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多