【问题标题】:How to access a file inside a zipped war file without using Java zip utils?如何在不使用 Java zip utils 的情况下访问压缩的 war 文件中的文件?
【发布时间】:2013-12-30 20:18:43
【问题描述】:

我们在应用服务器中部署了一个 .war 文件。我们需要访问该 .war 文件中的徽标图像,例如


  test.war
        |_ skin/
              |_ logo.gif

在我们的应用程序中,我们保留了一个指向该图像位置的属性文件,以便加载它:

imagepath = D:/server/.../test.war/skin/logo.gif

一切正常。

问题

现在我们将 test.war 更改为压缩(zipped)格式,我们当前的实现无法加载它。我们的目的是在不改变当前实现的情况下加载图像。也就是说我们可以通过改变图像来解决它属性文件中的路径?(我知道我们可以使用 zip utils 在 java 中访问压缩文件,不幸的是我们无法更改代码) 我们试过了

imagepath = jar:file:/D:/server/.../test.war!/skin/logo.gif

并没有工作。有希望吗?

【问题讨论】:

  • 不开启战争是不可能的。但通常,一旦部署,您的战争就会在webapps 文件夹(或类似的东西)中爆炸。然后你应该找到你的图像。
  • 我们使用 Jboss 作为 7。我没有为 war 文件找到任何分解的文件夹结构。我注意到tomcat中的那个东西,你说它会起作用
  • 也许您可以按照 [此处][1] 的说明首先引爆您的战争。 [1]:stackoverflow.com/questions/487363/…
  • 好的,还有什么不解压war文件的选项吗?

标签: java file


【解决方案1】:

这是下载 web.xml 并将其压缩的代码 (Servlet getMethod)。我想您可以轻松地将其转换为您的目的:只需删除 zip 流。

主要技巧是getRealPath。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            final String docxzip = "zip";

            // vzemi datoteko iz web xml
            String webXMLFile = getServletContext().getRealPath("/WEB-INF/web.xml");

            response.setContentType("application/zip");
            response.setHeader("Content-Disposition","inline; filename=output.zip;");

            ServletOutputStream outputStream = response.getOutputStream();
            ZipOutputStream zip = new ZipOutputStream(outputStream);
            zip.putNextEntry(new ZipEntry("web.xml"));

            byte[] b = new byte[1024];
            int len;
            FileInputStream fis = new FileInputStream(webXMLFile);
            while ((len = fis.read(b)) != -1) {
                zip.write(b, 0, len);
            }
            //response.setHeader("Content-Length", (new Integer(len)).toString());
            fis.close();
            zip.flush();
            zip.close();
            outputStream.flush();
            final PrintWriter out = response.getWriter();
            out.print(docxzip);
            out.flush();
            return;
        } catch (Exception ex) {
            HttpUtils.noData(response, ex.toString());
            return;
        }
    }

附:在某些 Java 服务器上可能会拒绝访问 WAR 中的文件。

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多