Я хочу загрузить библиотеку в разделенном загрузчике классов, потому что не хочу добавлять напрямую, поскольку зависимость не конфликтует с другими версиями проекта. Я создал загрузчик: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.
Именно это путь к ресурсу. Я создаю тестер для log4j, поэтому я взломал lib для доступа к чему-то, и я хочу отделить это от обычного использования log4j в проекте. Он работает, если банка не вложена в другую банку, иначе нет. –
Похоже, вы используете Maven. Рассматривали ли вы использование плагина Shade для создания исправленной версии Log4J с вашими изменениями, так что вам не нужно перепрыгивать через обручи классов классов? https://maven.apache.org/plugins/maven-shade-plugin – ck1
Да, его сделал Log4JHack-1.0.jar с плагином maven shade. Путь ресурсов такой же, как ваш пример. Но я хотел собрать всю историю в модуле загрузчика, чтобы не загрязнять пользовательский модуль ссылками на hardcoded string. Поэтому после загрузки модуля загрузчика, как правило, в качестве зависимости, это происходит. –