我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序。
我的jar包含一个依赖jar。(jar in jar)
我参考了JarRsrcLoader
and RsrcURLStreamHandlerFactory
由 Eclipse 开发的。
JarRsrcLoader
正在使用URL#setURLStreamHandlerFactory(RsrcURLStreamHandlerFactory)
解决rsrc
协议。
从而可以解析jar的类路径。
但通常的协议无法解决其副作用。
例如file:xxxx
or jar:xxxx
.
RsrcURLStreamHandlerFactory
has setURLStreamHandlerFactory
method.
也许我认为我应该为此方法设置默认实现。
我不知道这个方法是什么设置的。
只有一个实例URLStreamHandlerFactory
实现已注册到 Java 运行时,因此该实现必须了解所有支持的协议。
默认的 Oracle/Sun 行为不是以这种方式实现的,而是直接在java.net.URL
班级。因此,您不能简单地将默认实现作为链式工厂注入RsrcURLStreamHandlerFactory
。答案的第一部分。
The java.net.URL
getURLStreamHandler
方法加载协议的实现X
根据其类名的命名策略,默认为sun.net.www.protocol.X.Handler
如果你看jre/lib/rt.jar
, 你会找到:
sun/net/www/protocol/ftp/Handler.class
sun/net/www/protocol/gopher/Handler.class
sun/net/www/protocol/mailto/Handler.class
sun/net/www/protocol/netdoc/Handler.class
sun/net/www/protocol/http/Handler.class
sun/net/www/protocol/jar/Handler.class
sun/net/www/protocol/file/Handler.class
用于协议的基础包列表URLStreamHandler
选择来自于java.protocol.handler.pkgs
Java 系统属性。我邀请您阅读完整的源代码java/net/URL.java
从JDKsrc.zip
了解细节。
因此,正确的方法(无论 IBM/Eclipse 做了什么)是保留默认机制并设置实例-Djava.protocol.handler.pkgs="com.company.product.protocol"
在命令行上(如果您有权限/认证)。与一个URLStreamHandler
实施命名为com.company.product.protocol.rsrc.Handler
使用JarRsrcLoader
,你就完成了工作。
另一种选择是写一个URLStreamHandlerFactory
作为链式工厂实施RsrcURLStreamHandlerFactory
灵感来自URL.getURLStreamHandler
源代码。作为示例,您可以阅读这个旧的 JBoss 代码 http://docs.jboss.org/jbossas/javadoc/4.0.2/org/jboss/net/protocol/URLStreamHandlerFactory.java.html。它依赖于URL
内部处理程序通过预加载其他处理程序进行缓存known (or used)注册工厂之前的协议。在我看来,只是丑而已。
Warning: RsrcURLStreamHandler
替换了原来的180行代码URLStreamHandler.parseURL
通过它自己的 10 行“版本”,无需调用super.parseURL
。当然它不遵守 URL 连接规范!请注意,根据此类 URL 的使用方式,您可能会遇到错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)