如何在jar中获取资源路径

时间:2012-05-03 16:53:36

标签: java macos resources jar

我知道有很多类似的问题并且通过它们没有成功。我可能遗漏了一些非常基本的东西。 我在应用程序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文件时,输出为:     罐子:文件:/Users/Philippe/.Trash/Test/Test.jar /com/lamalva/ressources/SatelliteQuotaMonitor.html 并且html文件没有打开。 无论我做什么,我都无法正确道路。我一直都是“Test.jar!”在中间。 我将非常感谢帮助

5 个答案:

答案 0 :(得分:2)

一行答案是 -

String path = 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()

答案 1 :(得分:0)

您是否需要读取和更新jar文件中的资源?

您可以从输入流中读取内容 - 如果资源与类文件位于同一个包中,请使用相对路径。

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

要编写,您可能需要读取现有jar的内容,修改所需的部分,然后使用JarInputStream和JarOutputStream写出更新的内容。

答案 2 :(得分:0)

如果您想在jar中使用资源,则需要使用多个ClassLoader。此片段也适用于AppServer中。

在此示例中,我从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帮助您。

答案 3 :(得分:0)

具有!解压缩子协议的网址无法在普通浏览器中使用。就像ssh:(终端访问)或smtp: / mailto:(电子邮件)一样。另外“file:.... / my.jar!...”是普通网址的无法扩展。

JTextPane / JEditorPane具有有限的HTML支持。还有一些java浏览器项目。

也许可以使用嵌入java Jetty Web服务器。

答案 4 :(得分:0)

要在默认平台Web浏览器中从类路径打开资源,您有两个选择。将所述资源提取并复制到文件系统上的临时位置并传递file:url。另一个也许更好的选择是运行嵌入式Web服务器(例如Jetty)并直接从类路径提供资源。