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 运行此代码时,输​​出为:file:/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!” 在中间。我将非常感谢帮助

4

5 回答 5

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()

于 2014-11-26T12:35:54.650 回答
0

带有!解压子协议的 URL 不能在普通浏览器中使用。就像ssh:(终端访问)或smtp:/ mailto:(电子邮件)。此外,“file:..../my.jar!...”是普通 URL 的一个无法使用的扩展。

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

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

于 2012-05-03T17:08:22.353 回答
0

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

于 2012-05-03T17:10:40.257 回答
0

ClassLoader如果你想要一个 jar 中的资源,你需要使用几个。这个片段也适用于 AppServers。

在这个例子中,我从sqlite-jdbc-3.7.2.jar位于org.sqlitepackage.json 的文件中读取。

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 类加载器

如果您想更新内容,Jar Inspector可以帮助您。

于 2012-05-03T17:07:40.570 回答
0

需要读取和更新jar文件中的资源吗?

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

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

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

于 2012-05-03T17:07:08.167 回答