在Java中,您可以使用相同的API但使用不同的URL协议加载所有类型的资源:
file:///tmp.txt
http://127.0.0.1:8080/a.properties
jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
Run Code Online (Sandbox Code Playgroud)
这很好地将资源的实际加载与需要资源的应用程序分离,并且由于URL只是一个String,因此资源加载也很容易配置.
是否有使用当前类加载器加载资源的协议?这与Jar协议类似,不同之处在于我不需要知道资源来自哪个jar文件或类文件夹.
Class.getResourceAsStream("a.xml")当然,我可以使用它,但这需要我使用不同的API,因此更改现有代码.我希望能够在所有我可以通过更新属性文件指定资源URL的地方使用它.
URL u =新URL("telnet://route-server.exodus.net");
这条线正在产生:
java.net.MalformedURLException:未知协议:telnet
我遇到与以"news://"开头的其他网址类似的问题
这些是从ODP中提取的URL,所以我不明白为什么会出现这样的例外情况.
我能够成功地使用我的应用程序中的模板:
<ui:decorate template="/WEB-INF/templates/mytemplate.xhtml">
Run Code Online (Sandbox Code Playgroud)
我还可以移动模板/META-INF/templates/mytemplate.xhtml一的JAR和得到这个工作:
<ui:decorate template="/templates/mytemplate.xhtml">
Run Code Online (Sandbox Code Playgroud)
我实际上想把这个文件放到文件系统(或数据库)上.我怎样才能做到这一点?我发现很多相关的东西com.sun.facelets.impl.DefaultResourceResolver,但我认为这实际上与覆盖模板的服务有关.它不是尝试解析URL,它只是试图以某种方式在类路径上获取文件.
我正在尝试注册一个自定义URLStreamHandler来以通用方式处理对Amazon S3 URL的请求.处理程序的实现看起来非常像S3-URLStreamHandler(github).我没有将我的Handler课程放入sun.net.www.protocol.s3包中,而是使用自定义包com.github.dpr.protocol.s3.为了使Java拾取这个包,我提供了-Djava.protocol.handler.pkgs="com.github.dpr.protocol"遵循URL类文档的系统属性.但是,如果我尝试处理类似的s3-URL s3://my.bucket/some-awesome-file.txt,我会得到MalformedURLException:
Caused by: java.net.MalformedURLException: unknown protocol: s3
at java.net.URL.<init>(URL.java:600)
at java.net.URL.<init>(URL.java:490)
at java.net.URL.<init>(URL.java:439)
at java.net.URI.toURL(URI.java:1089)
...
Run Code Online (Sandbox Code Playgroud)
我的应用程序是一个基于Spring的Web应用程序,目前在tomcat中运行,但不应该对底层应用程序容器的任何知识混乱.
我已经调试了相应的代码,发现我URLStreamHandler无法初始化,因为用于加载类的类加载器不知道它.这是java.net.URL(jdk 1.8.0_92)的相应代码:
1174: try {
1175: cls = Class.forName(clsName);
1176: } catch (ClassNotFoundException e) {
1177: ClassLoader cl = ClassLoader.getSystemClassLoader();
1178: if (cl != null) {
1179: cls = cl.loadClass(clsName);
1180: }
1181: }
Run Code Online (Sandbox Code Playgroud)
类的类加载器java.net.URL(由...使用Class.forName) …