2016-06-04 3 views
0

Я хочу загрузить библиотеку в разделенном загрузчике классов, потому что не хочу добавлять напрямую, поскольку зависимость не конфликтует с другими версиями проекта. Я создал загрузчик:URLClassLoader не может обрабатывать jar: URL-адрес файла?

public LibLoader(String resourcePath) { 
    //resourcePath="/lib/Log4JHack-1.0.jar" 
    URL url = getClass().getResource(resourcePath); 
    loader = new URLClassLoader(new URL[] {url}, getClass().getClassLoader()); 
} 

URL = [файл:/D: /..../ Библиотека/Log4JHack-1.0.jar]

если URL является файл , то он хорошо работает.

URL = [баночка: Файл:/C: /..../ Log4JHackLoader-1.0.jar /lib/Log4JHack-1.0.jar]

если URL является баночка: файл (банки внутри баночки), то не работает:

ERROR StatusLogger Unable to open jar:jar:file:/C:/Users/Dani/.m2/repository/hu/daniel/hari/log4jhack/Log4JHackLoader/1.0/Log4JHackLoader-1.0.jar!/lib/Log4JHack-1.0.jar!/META-INF/log4j-provider.properties java.net.MalformedURLException: no !/ in spec 
    at java.net.URL.<init>(URL.java:620) 
    at java.net.URL.<init>(URL.java:483) 
    at java.net.URL.<init>(URL.java:432) 
    at java.net.JarURLConnection.parseSpecs(JarURLConnection.java:175) 
    at java.net.JarURLConnection.<init>(JarURLConnection.java:158) 
    at sun.net.www.protocol.jar.JarURLConnection.<init>(JarURLConnection.java:81) 
    at sun.net.www.protocol.jar.Handler.openConnection(Handler.java:41) 
    at java.net.URL.openConnection(URL.java:972) 
    at java.net.URL.openStream(URL.java:1038) 
    at org.apache.logging.log4j.util.ProviderUtil.loadProvider(ProviderUtil.java:79) 
    at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:66) 
    at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:122) 
    at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:106) 
    at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:91) 
    at hu.daniel.hari.log4jpattern.logrenderer.log4j.log4j.capture.log4j2.StringLoggerCapture.<clinit>(StringLoggerCapture.java:34) 
    at hu.daniel.hari.log4jpattern.logrenderer.log4j.Log4j2Hack.doRender(Log4j2Hack.java:30) 
    at hu.daniel.hari.log4jpattern.logrenderer.log4j.Log4j2Hack.render(Log4j2Hack.java:23) 
    at hu.daniel.hari.log4jpattern.logrenderer.log4j.renderer.AbstractLog4jRendererAdapter.render(AbstractLog4jRendererAdapter.java:25) 
    at hu.daniel.hari.log4jpattern.logrenderer.service.LogRendererServiceImpl.getOutput(LogRendererServiceImpl.java:44) 
    at hu.daniel.hari.log4jpattern.logrenderer.service.LogRendererServiceImpl.render(LogRendererServiceImpl.java:37) 
    at hu.daniel.hari.log4jpattern.logrenderer.TestMain.main(TestMain.java:14) 
Caused by: java.lang.NullPointerException: no !/ in spec 
    at sun.net.www.protocol.jar.Handler.parseAbsoluteSpec(Handler.java:171) 
    at sun.net.www.protocol.jar.Handler.parseURL(Handler.java:151) 
    at java.net.URL.<init>(URL.java:615) 
    ... 20 more 

Так как я хочу, чтобы упаковать загружаемый Log4JHack-1.0.jar в Log4JHackLoader-1.0.jar, мне нужно решение loadin g из внутренний jar.

ответ

1

Это не на 100% ясно, что вы пытаетесь сделать здесь. Почему вы пытаетесь включить конфликтующие зависимости в свой путь к классам?

В любом случае это известное ограничение UrlClassLoader. Рассматривали ли вы извлечение вложенной банки как временного файла в файловой системе, а затем указывали на него загрузчик классов?

+0

Именно это путь к ресурсу. Я создаю тестер для log4j, поэтому я взломал lib для доступа к чему-то, и я хочу отделить это от обычного использования log4j в проекте. Он работает, если банка не вложена в другую банку, иначе нет. –

+0

Похоже, вы используете Maven. Рассматривали ли вы использование плагина Shade для создания исправленной версии Log4J с вашими изменениями, так что вам не нужно перепрыгивать через обручи классов классов? https://maven.apache.org/plugins/maven-shade-plugin – ck1

+0

Да, его сделал Log4JHack-1.0.jar с плагином maven shade. Путь ресурсов такой же, как ваш пример. Но я хотел собрать всю историю в модуле загрузчика, чтобы не загрязнять пользовательский модуль ссылками на hardcoded string. Поэтому после загрузки модуля загрузчика, как правило, в качестве зависимости, это происходит. –

Смежные вопросы