代码之家  ›  专栏  ›  技术社区  ›  Andrew Swan

在EAR中获取JAR中文件的绝对路径?

  •  7
  • Andrew Swan  · 技术社区  · 17 年前

    我有一个部署为EAR文件的J2EE应用程序,它依次包含一个用于业务层代码(包括一些EJB)的JAR文件和一个用于web层代码的WAR文件。EAR文件被部署到JBoss3.2.5,它解压EAR和WAR文件,但不是JAR文件(这不是问题,仅供参考)。

    JAR文件中的一个文件是MS Word模板,其绝对路径需要传递给一些原生MS Word代码(使用 Jacob

    URL url = getClass().getResource("myTemplate.dot");
    File file = new File(url.toURI()); // <= fails!
    String absolutePath = file.getAbsolutePath();
    // Pass the absolutePath to MS Word to be opened as a document
    

    ... 然后 java.io.File 构造函数抛出IllegalArgumentException“URI不是分层的”。URL和URI都具有相同的toString()输出,即:

    jar:file:/G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents/myapp.jar!/my/package/myTemplate.dot
    

    G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents
    

    获取此文件绝对路径的最简单方法是什么?

    3 回复  |  直到 17 年前
        1
  •  6
  •   Andrew Swan    17 年前

    File tempDir = new File(System.getProperty("java.io.tmpdir"));
    File temporaryFile = new File(tempDir, "templateCopy.dot");
    InputStream templateStream = getClass().getResourceAsStream("myTemplate.dot");
    IOUtils.copy(templateStream, new FileOutputStream(temporaryFile));
    String absolutePath = temporaryFile.getAbsolutePath();
    

    我更喜欢不涉及复制文件的解决方案。

        2
  •  1
  •   Chris Thornhill    17 年前

    除非传递URI字符串的代码或应用程序接受一种格式,该格式指定jar/zip文件中的位置,否则将文件复制到临时位置可能是最好的解决方案。

    如果经常引用这些文件,您可能希望缓存提取文件的位置,并在每次需要时验证其存在性。

        3
  •  0
  •   Thilo    17 年前

    您应该将内容复制到临时文件(可能带有缓存),因为尝试访问应用程序容器的内部文件是您希望避免的依赖关系。甚至可能根本没有提取的文件(它可以直接从JAR加载)。