我知道有很多类似的问题并且通过它们没有成功。我可能遗漏了一些非常基本的东西。 我在应用程序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!”在中间。 我将非常感谢帮助
答案 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)并直接从类路径提供资源。