2012-05-03 31 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