use*_*137 7 java eclipse executable-jar
我正在使用带有嵌入式Jetty的可执行jar开发Web应用程序.
我的罐子包含依赖JAR(JAR罐中)
我所引用JarRsrcLoader,并RsrcURLStreamHandlerFactory通过Eclipse的开发.
JarRsrcLoader使用URL#setURLStreamHandlerFactory(RsrcURLStreamHandlerFactory)解决rsrc协议.
从而它可以解析jar的类路径.
但是,作为副作用解决通常的协议变得不可能.
例如file:xxxx或jar:xxxx.
RsrcURLStreamHandlerFactory有setURLStreamHandlerFactory方法.
也许我认为我应该为这个方法设置默认工具.
我不知道这个方法是什么设置的.
Yve*_*tin 11
URLStreamHandlerFactory在Java运行时中只注册了一个实现实例,因此该实现必须了解所有支持的协议.
默认的Oracle/Sun行为不是以这种方式实现的,而是直接在java.net.URL类中实现的.因此,您不能简单地将默认实现注入到链式工厂中RsrcURLStreamHandlerFactory.第一部分答案.
该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
Run Code Online (Sandbox Code Playgroud)
用于协议URLStreamHandler选择的基础包列表来自java.protocol.handler.pkgsJava系统属性.我邀请您阅读java/net/URL.javaJDK 的完整源代码src.zip以了解详细信息.
因此,正确的方法(无论IBM/Eclipse做了什么)是保留默认机制并-Djava.protocol.handler.pkgs="com.company.product.protocol"在命令行设置(例如,如果您有权限/认可这样做).随着URLStreamHandler执行命名com.company.product.protocol.rsrc.Handler使用JarRsrcLoader,你把工作做好.
备选方案是URLStreamHandlerFactory在源代码的RsrcURLStreamHandlerFactory启发下将实现编写为链式工厂URL.getURLStreamHandler.例如,您可以阅读这个旧的JBoss代码.它URL通过在注册工厂之前预加载其他已知(或使用过的)协议来依赖内部处理程序缓存.在我看来,只是丑陋.
警告:RsrcURLStreamHandler已经用URLStreamHandler.parseURL自己的10行"版本" 替换了原来的180行代码而没有调用super.parseURL.当然,它不尊重URL连接规范!请注意,根据URL的使用方式,您可能会遇到错误.
| 归档时间: |
|
| 查看次数: |
5624 次 |
| 最近记录: |