2014-10-08 102 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