以下代码公开了这个bug,我知道我可以直接调整getFile()&的结果。 getPath()但我正在寻找更优雅,更强大的东西。我希望能够在默认情况下在包含jar中的文件夹中行走,并使用用户选择/配置路径来查找&加载资源。
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
public class UrlBug {
UrlBug() {
try {
final URL resourceRoot = this.getClass().getClassLoader().getResource(".");
System.out.println(resourceRoot.getFile());
System.out.println(resourceRoot.getPath());
System.out.println(resourceRoot.toURI());
System.out.println(resourceRoot.toExternalForm());
System.out.println(resourceRoot.toString());
new URL(resourceRoot.getFile());
} catch (final URISyntaxException e) {
e.printStackTrace();
} catch (final MalformedURLException e) {
e.printStackTrace();
}
}
public static void main(final String[] args) {
new UrlBug();
}
}
以下使用' bug'
生成的输出/C:/Users/Me/workspaces/.../target/classes/ <-- Malformed filename
/C:/Users/Me/workspaces/.../target/classes/ <-- Malformed path
file:/C:/Users/Me/workspaces/.../target/classes/
file:/C:/Users/Me/workspaces/.../target/classes/
file:/C:/Users/Me/workspaces/.../target/classes/
java.net.MalformedURLException: no protocol:
/C:/Users/Me/workspaces/scratch/target/classes/ at
java.net.URL.<init>(URL.java:585) at
java.net.URL.<init>(URL.java:482) at
java.net.URL.<init>(URL.java:431) at
scratch.UrlBug.<init>(UrlBug.java:20) at
scratch.UrlBug.main(UrlBug.java:39)
答案 0 :(得分:1)
我不确定你为什么要自己走jar目录结构。 Java有现有的类来处理这种情况。要修复代码,您只需使用toString()
方法:
new URL(resourceRoot.toString());
“file:/”前缀是“协议”。使用toString()
方法可确保将“file:/”协议添加到字符串之前。根据文件:
Protocol handlers for the following protocols are guaranteed to exist on the search path:
http, https, ftp, file, and jar