如何从classpath获取jar文件?

时间:2014-10-08 14:42:04

标签: java classpath

我有一个依赖于某个jar的网络应用程序。 jar位于WEB-INF/lib文件夹中。在运行时,我需要将jar复制到另一个文件夹,然后将其解压缩。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

例如,获取webapp的WEB-INF/lib文件夹:

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

获取特定的jar文件:

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

Jar文件是普通的zip文件。您可以像任何其他zip文件一样提取它。有关详细信息,请参阅ZipFileJarFile

答案 1 :(得分: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)?

当然,您需要调整那里给出的示例,再次将您的文件写入您可以实际写作的积极位置。