2009-04-27 131 views
7

我有一个J2EE应用程序作为EAR文件部署,而EAR文件又包含用于业务层代码(包括一些EJB)的JAR文件和用于Web层代码的WAR文件。 EAR文件被部署到JBoss 3.2.5,它解压缩EAR和WAR文件,但不包括JAR文件(这不是问题,仅仅是供参考)。在EAR中获取JAR文件的绝对路径?

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 

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

回答

7

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

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

我宁愿不涉及复制文件的解决方案。

+0

当我发现这个问题,我的第一想法是“是的,也许唯一的办法是写一个临时文件!”。令人惊讶的是,这是唯一的方法!怎么可能无法在jar中处理路径?如果你能得到流,你可以在完美的世界中获得文件。 – 2011-03-10 16:00:55

1

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

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

+0

谢谢克里斯。我非常确定Word需要一个绝对路径,并且会被JAR/ZIP风格的路径所迷惑。我实在懒,将原始文件复制到临时文件夹,我只是离开了那我的答案简洁的缘故。 – 2009-04-27 01:10:13

0

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