【问题标题】:How to read a war/jar file which does not have manifest如何读取没有清单的war/jar文件
【发布时间】:2011-08-22 10:00:00
【问题描述】:

我有一个不包含清单的战争文件,甚至不包含 META-INF 文件夹。现在我的问题是我编写了一个代码,该代码在包含清单的普通战争文件中运行良好。现在我需要读取一个不包含清单的战争文件。

当我检查时

while ((ze = zis.getNextEntry()) != null)

这个条件只是被跳过了。是否有任何 API 将其视为普通 zip 文件或有任何解决方法。

我尝试过使用JarEntryZipEntry。这是一个应该解释的小sn-p。

try {
            FileInputStream fis = new FileInputStream(applicationPack);
            ZipArchiveInputStream zis = new ZipArchiveInputStream(fis);
            ArchiveEntry ze = null;
            File applicationPackConfiguration;           
            while ((ze = zis.getNextEntry()) != null) {
            // do someting
}

可以做什么?

【问题讨论】:

    标签: java jar manifest war


    【解决方案1】:

    您可以使用ZipFile 类简单地列出内容:

    try {
      // Open the ZIP file
      ZipFile zf = new ZipFile("filename.zip");
    
      // Enumerate each entry
      for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {
        // Get the entry name
        String zipEntryName = ((ZipEntry)entries.nextElement()).getName();
      }
    } catch (IOException e) {
    }
    

    示例取自hereretrieving the file from zip 的另一个例子。

    更新:

    上面的代码确实存在仅包含目录作为顶级元素的 zip 文件的问题。

    此代码有效(已测试):

        try {
            // Open the ZIP file
            FileInputStream fis = new FileInputStream(new File("/your.war"));
            ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
    
            ZipEntry entry = null;
    
            while ((entry = zis.getNextEntry()) != null)
                // Get the entry name
                System.out.println(entry.getName());
        } catch (IOException e) {
        }
    

    【讨论】:

    • 我测试了这些例子,但如果我们使用 entry.hasMoreElements() 它就不会从那里读取任何条目。这就是我卡住的地方
    • 我尝试了相同的代码,其中一场战争包含清单,而另一场没有清单。有人知道吗?
    • 不更新在概念上与我发布的代码相同。 zis.getNextEntry() 如果没有得到则先查找manifest,将其视为空
    • war 和 jar 文件只是 zip 文件,所以这段代码应该读取它们并显示内容。 Manifest 与 zip 文件格式无关。
    • 不正确:.getNextEntry() 在 zip 文件中查找新条目(文件或目录)。战争清单只是 zip 中的一个文件。
    【解决方案2】:

    您可以使用 java.util.zip 包中的类。只需将 ZipArchiveInputStream 替换为 ZipInputStream 并将 ArchiveEntry 替换为 ZipEntry:

    FileInputStream fis = new FileInputStream(new File("/path/to/your.war"));
    ZipInputStream zis = new ZipInputStream(fis);
    ZipEntry ze = null;
    while ((ze = zis.getNextEntry()) != null) {
       System.out.println(ze.getName());
    }
    

    【讨论】:

    • 我首先使用 ZipEntry,然后切换到 ZipArchiveInputStream 。无效
    • applicationPack 是 java.util.File 吗?
    • 什么 XML?如果你想打开它,你应该在这里使用 new File("your.war") 。见linkFileInputStream[/link]
    • errr 对不起我的错误。参数 applicationPack 是一个战争文件,我正在尝试读取其内容。
    • 我会遇到文件未找到异常
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2014-05-13
    • 2013-06-14
    • 2011-03-20
    • 1970-01-01
    • 2018-02-10
    • 2013-02-20
    • 2014-10-08
    相关资源
    最近更新 更多