2014-10-08 105 views
1

我有一个网络应用程序,这取决于一些罐子。该罐子位于WEB-INF/lib文件夹中。在运行时,我需要将jar复制到另一个文件夹,然后解压缩它。有没有什么办法呢?如何从classpath获取jar文件?

+0

不是简单地通过在类路径中的jar,没有。你为什么想这样做? – 2014-10-08 14:48:26

+0

添加jar作为“添加类文件夹”,那么你不需要明确提取它。 – 2014-10-08 14:48:42

回答

1

我不确定在哪种情况下您尝试这样做。如果你在Spring应用程序或其他应用程序中,它可能与我在这里描述的有所不同。

如果你是在一个Servlet的上下文中,你可以只是简化Java ClassLoader或者更准确地说你的运行时环境的类加载器在你的情况下很可能是一个应用服务器,比如Tomcat或者Glassfish来获取流阅读JAR文件,例如

InputStream in = getServletContext().getResourceAsStream("/WEB-INF/lib/yourlib.jar"); 

您将得到一个可用于读取文件的InputStream。然后,您可以使用Apache Commons FileUtils将Stream复制到另一个文件。

File outputFile = File.createTempFile("temp-file-name", ".jar"); 
FileUtils.copyInputStreamToFile(in, outputFile); 

在上面的例子中,我把把代码写入临时目录。我无法回答哪个应用程序服务器实际上允许您写入任意文件系统位置,哪一个不会。所以我认为应该在每个环境中写入临时目录。

为您的最后一步。实际上提取JAR文件我想向你推荐这篇文章,它是如何从Java代码中提取JAR/ZIP文件的极好解释。

How to write a Java program which can extract a JAR file and store its data in specified directory (location)?

当然,你将需要适应给出有再次的文件写入到你在哪里积极的你其实可以写一个位置的例子。

1

您可以使用ServletContext.getRealPath()来获取真实路径的虚拟路径。

例如获得web应用程序的文件夹WEB-INF/lib

File libFolder = new File(ServletContext.getRealPath("/"), "WEB-INF/lib"); 

为了得到一个特定的jar文件:

File jarFlie = new File(libFolder, "somejar.jar"); 

Jar文件是正常的zip文件。您可以像其他zip文件一样将其解压缩。有关详细信息,请参阅ZipFileJarFile