2012-05-03 32 views
1

我知道有很多類似的問題,並且一直沒有成功。我可能錯過了一些非常基本的東西。 我在應用程序jar文件中的ressources包中有html文件,我需要檢索它們的路徑來讀取和更新它們。這裏是我的代碼:如何獲得罐子裏的資源路徑

URL url = ClassLoader.class.getResource("/com/lamalva/ressources/test.html"); 
System.out.println(url);   
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url.toString())); 

當我運行從NetBeans IDE中的代碼,輸出爲: 文件:/Users/Philippe/NetBeansProjects/Test/build/classes/com/lamalva/ressources/SatelliteQuotaMonitor.html 和html文件在瀏覽器中按預期打開,但是當我從OSX終端運行jar文件時,輸出爲: jar:file:/Users/Philippe/.Trash/Test/Test.jar!/ com/lamalva/ressources/SatelliteQuotaMonitor.html 和html文件未打開。 無論我做什麼,我都無法獲得正確的路徑。我一直都是「Test.jar!」在中間。 我將非常感謝幫助

+1

爲什麼JAR文件被你的OSX垃圾桶的執行?無論如何,我相當肯定您的默認瀏覽器不會知道如何從JAR文件中檢索HTML資源。 – Perception

+0

我不知道爲什麼jar文件在垃圾箱外執行。我有這個問題沒有簡單的答案。我會將我的文件從jar中移出並將它們包含在zip文件中,這很容易並且應該可以工作。 – philippehenri

回答

0

您是否需要閱讀和更新jar文件中的資源?

您可以從輸入流中讀取內容 - 如果資源與類文件位於同一個包中,則使用相對路徑。

InputStream in = this.getClass().getResourceAsStream("/class/path/to/file"); 

寫,你可能需要在現有的罐子的內容讀取,修改,那麼你想要寫出來使用JarInputStream並的JarOutputStream更新的內容部分。

+0

我的資源是我需要更新並在默認瀏覽器中打開的html文件。我不需要在應用程序中閱讀它們,但我需要他們的路徑在瀏覽器中打開它們。 html文件存儲在資源中,因爲它們需要資源/腳本中的javascript – philippehenri

+0

java中的URL不一定是Web瀏覽器可以理解的URL。您需要將jar文件提取到臨時位置,然後瀏覽器將無法在jar內顯示文件。看看java.util.jar.JarFile - 你需要迭代entries()方法並提取內容。 – cvanes

0

如果您需要jar中的資源,則需要使用多個ClassLoader。此片段也適用於AppServers。

在這個例子中,我從sqlite-jdbc-3.7.2.jar讀取了位於org.sqlite包中的文件。

public class Main { 

private static InputStream getResourceAsStream(String resource) throws FileNotFoundException { 
    String stripped = resource.startsWith("/") ? resource.substring(1) : resource; 
    InputStream stream = null; 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    if (classLoader != null) { 
     stream = classLoader.getResourceAsStream(stripped); 
    } 
    if (stream == null) { 
     stream = MyClass.class.getResourceAsStream(resource); 
    } 
    if (stream == null) { 
     stream = MyClass.class.getClassLoader().getResourceAsStream(stripped); 
    } 
    if (stream == null) { 
     throw new FileNotFoundException("File not found: " + resource); 
    } 
    return stream; 
} 

public static void main(String[] args) throws FileNotFoundException { 
    // Read file from JAR sqlite-jdbc-3.7.2.jar 
    Scanner sc = new Scanner(getResourceAsStream("org/sqlite/NativeDB.c")); 
    while(sc.hasNextLine()) { 
     System.out.println(sc.nextLine()); 
    } 
} 

}

有關詳細信息讀取Java Classloader

如果你想更新的內容,可能Jar Inspector幫助你。

0

帶有!解壓縮子協議的URL不能在普通瀏覽器中使用。就像ssh:(終端訪問)或smtp:/mailto:(電子郵件)。另外「file:..../my.jar!...」就是普通URL的這種不可用的擴展。

有JTextPane/JEditorPane有限的HTML支持。還有一些java瀏覽器項目。

也許可以嵌入java Jetty web服務器。

0

要在默認平臺Web瀏覽器中從類路徑打開資源,您有兩個選項。提取並將所述資源複製到文件系統上的臨時位置並傳遞file:url。另一種可能更好的選擇是運行嵌入式Web服務器(如Jetty)並直接從您的類路徑提供資源。

2

的一行答案是 - 。

字符串路徑= this.getClass()getClassLoader()的getResource()toExternalForm()。

基本上getResource方法給出了URL。從這個URL你可以通過調用toExternalForm()來提取路徑。

參考文獻:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String)https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#toExternalForm()

+0

似乎在我的IDE中工作,但不是從獨奏jar文件本身。 – Woodrow