В среде выполнения Java зарегистрирован только один экземпляр реализации URLStreamHandlerFactory
, поэтому эта реализация должна знать обо всех поддерживаемых протоколах.
Поведение 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
Список базовых пакетов, используемых для выбора протокола URLStreamHandler
, происходит из java.protocol.handler.pkgs
системного свойства Java.Я предлагаю вам прочитать полный исходный код java/net/URL.java
из JDK 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
заменил исходный код из 180 строк URLStreamHandler.parseURL
на свой собственный 10-строки "версия" без вызова super.parseURL
.Конечно, это не соответствует спецификации конкатенации URL!Будьте осторожны, вы можете столкнуться с ошибкой в зависимости от способа использования таких URL.