Приложение весенней загрузки + jolokia - исключение при запуске
Я использую весеннюю загрузку 1.5.3.RELEASE и jolokia 1.3.6 (также происходит в последних версиях).
Jolokia интегрируется путем добавления зависимости:
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
Не удается запустить одно из наших микросервисов, использующих одну и ту же архитектуру, и я вижу исключение со следующей основной причиной при запуске:
Caused by: java.io.FileNotFoundException: JAR entry BOOT-INF/lib/jolokia-
core-1.3.7.jar!/META-INF/simplifiers-default not found in
<MY_JAR_NAME_GOES_HERE>.jar
at
sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:142)
at
sun.net.www.protocol.jar.JarURLConnection.getInputStream
(JarURLConnection.java:150)
at java.net.URL.openStream(URL.java:1045)
at
org.jolokia.util.ServiceObjectFactory
.readServiceDefinitionFromUrl(ServiceObjectFactory.java:90)
Это исключение не происходит при запуске приложения из среды IDE, только при запуске с java -jar <MY_JAR>
,
Я посмотрел на строку, которая выдает исключение внутри кода Jolokia, и это выглядит так:
reader = new LineNumberReader(new InputStreamReader(new URL(pUrl).openStream(),"UTF8"));
Итак, я заключаю (после отладки), что new URL(pUrl).openStream()
не удается найти запись JAR, как указано в вышеупомянутой трассировке стека исключений. Я также понимаю, что в IDE этого не происходит, потому что он работает с различными загрузчиками классов (загрузочное приложение Spring использует LaunchedURLClassLoader).
Тем не менее, я не вижу здесь ошибки в исходном коде: у нас много микросервисов, все работают с одинаковыми конфигурациями, и это работает как положено, кроме того, насколько я знаю, это документированный способ jolokia интеграция.
Поэтому я подозреваю, что здесь какое-то состояние гонки или что-то в этом роде, но я действительно могу точно указать, что здесь происходит.
Кто-нибудь сталкивался с такой проблемой? Есть ли обходной путь?
Заранее спасибо.
1 ответ
Я получал точно такое же исключение. Проблема в моем случае заключалась в том, что имя файла +
(Я использую плагин Reckon Gradle для создания версии проекта). Решением было переименовать файл перед запуском java -jar
,
Я столкнулся с той же проблемой с Spring Boot 1.5.22 и версией jolokia по умолчанию.
У меня есть другое приложение (та же версия SpringBoot, jolokia), в котором не было проблемы... Я не нашел никаких различий между двумя приложениями...
Но у меня есть обходной путь: проинструктируйте Spring Boot извлечь jolokia jar, чтобы пропустить процесс загрузки вложенного URL-адреса Spring boot только для jolokia jar.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<requiresUnpack>
<dependency>
<artifactId>jolokia-core</artifactId>
<groupId>org.jolokia</groupId>
</dependency>
</requiresUnpack>
</configuration>
</plugin>
см. https://docs.spring.io/spring-boot/docs/1.5.x/reference/htmlsingle/
Благодаря этому обходному пути jolokia довольна, конечная точка / jolokia доступна, а вкладка Spring Boot Admin jmx активна.