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

时间:2009-04-27 00:32:22

标签: java file java-ee path jar

我有一个部署为EAR文件的J2EE应用程序,该文件又包含业务层代码(包括一些EJB)的JAR文件和Web层代码的WAR文件。 EAR文件部署到JBoss 3.2.5,它解压缩EAR和WAR文件,但不解压缩JAR文件(这不是问题,只是FYI)。

JAR文件中的一个文件是MS Word模板,其绝对路径需要传递给某些本机MS Word代码(使用Jacob,FWIW)。

问题是,如果我尝试获取这样的文件(来自JAR文件中的某些代码):

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

这条路径在文件系统上是有效的,但其余路径不是(在JAR文件的内部):

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

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

3 个答案:

答案 0 :(得分:6)

我目前的解决方案是将文件复制到服务器的临时目录,然后使用副本的绝对路径:

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();

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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