maven зависимость + локальный jar в пути сборки = конфликт slf4j
Я пытаюсь использовать IMPINJ Octane SDK Java, который поставляется как jar, включая все необходимые зависимости вместе с Spark Framework в проекте maven. Для включения Spark Framework я использую maven, и к пути сборки добавляется jar Octane SDK. Мой pom.xml имеет только искровую зависимость:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.5</version>
</dependency>
Каждый раз, когда я пытаюсь запустить программу, я получаю следующую ошибку.
Exception in thread "Thread-1" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at org.eclipse.jetty.util.log.JettyAwareLogger.log(JettyAwareLogger.java:619)
at org.eclipse.jetty.util.log.JettyAwareLogger.info(JettyAwareLogger.java:314)
at org.eclipse.jetty.util.log.Slf4jLog.info(Slf4jLog.java:74)
at org.eclipse.jetty.util.log.Log.initialized(Log.java:186)
at org.eclipse.jetty.util.log.Log.getLogger(Log.java:298)
at org.eclipse.jetty.util.log.Log.getLogger(Log.java:288)
at org.eclipse.jetty.util.component.AbstractLifeCycle.<clinit>(AbstractLifeCycle.java:35)
at spark.embeddedserver.jetty.EmbeddedJettyFactory.create(EmbeddedJettyFactory.java:34)
at spark.embeddedserver.EmbeddedServers.create(EmbeddedServers.java:57)
at spark.Service.lambda$init$0(Service.java:342)
at java.lang.Thread.run(Thread.java:745)
Octane SDK поставляется с slf4j, а Spark Framework также имеет зависимость slf4j, но у них разные версии. Я нашел следующую ветку NoSuchMethodError с SLF4J API, но так как я мог удалить slf4j из фляги, я не могу решить проблему. Как я могу заставить это работать?
Я также пытался исключить slf4j в pom, но это тоже не сработало:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.5</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
РЕДАКТИРОВАТЬ (РЕШЕНИЕ): Я извлек банку Octane SDK, удалил slf4j и сжал его обратно в банку.
1 ответ
Насколько я понимаю, искры требует slf4j 1.7.13. Затем вы добавляете Octane в classpath (не через зависимость от maven), и этот jar-файл Octane содержит старые классы slf4j.
Я только что скачал Octane, чтобы убедиться в этом. Я заметил, что это включает в себя 2 версии:
- OctaneSDKJava-1.22.0.30.jar
- OctaneSDKJava-1.22.0.30-банку-с-dependencies.jar
Вам нужно использовать OctaneSDKJava-1.22.0.30.jar и вручную включить все другие зависимости, кроме НЕ slf4j (или наоборот, использовать OctaneSDKJava-1.22.0.30-jar-with-dependencies.jar и удалить slf4j).
РЕДАКТИРОВАТЬ, чтобы ответить на вопрос в комментариях:
Я открыл последний файл OctaneSDKJava-1.26.2.0-jar-with-dependencies.zip, который содержит файл README.txt со следующими подробностями:
ЗАВИСИМОСТИ
ОСНОВНЫЕ ЗАВИСИМОСТИ
- JDOM 1.0 http://www.jdom.org/
- log4j 1.2.15 http://logging.apache.org/log4j/1.2/download.html
- jargs 1.0 http://sourceforge.net/project/showfiles.php?group_id=33024
- мина 1.1.7 http://mina.apache.org/
- slf4j-log4j12 1.5.0 http://www.slf4j.org/
- slf4j-api 1.5.0 http://www.slf4j.org/
- xerces-j 2.4.0 http://xerces.apache.org/
ПОЛНАЯ ЗАВИСИМОСТЬ
- speed-dep 1.5 http://velocity.apache.org/
- jalopy 0.3.1 http://jalopy.sourceforge.net/
- JDOM 1.0 http://www.jdom.org/
- log4j 1.2.15 http://logging.apache.org/log4j/1.2/download.html
- commons-collection 3.2 http://commons.apache.org/
- commons-configuration 1.5 http://commons.apache.org/
- commons-lang 2.3 http://commons.apache.org/
- common-logging 1.1.1 http://commons.apache.org/
JAXB RI зависимости, в том числе:
- jaxb-xjc 2.0 https://jaxb.dev.java.net/
- jaxb-impl 2.0 https://jaxb.dev.java.net/
- jaxb-api 2.0 https://jaxb.dev.java.net/
- Активация 2.0 https://jaxb.dev.java.net/
- jsr173_1.0_api 2.0 https://jaxb.dev.java.net/
Пять вышеуказанных зависимостей jaxb доступны в одном jar-файле "JAXB RI" по https://jaxb.dev.java.net/. Выполните этот jar (дважды щелкните окна, "java -jar " на всех других платформах) и скопируйте отдельные jar в каталог LTKJava/lib), а также приведенные выше зависимости времени выполнения
ЗАВИСИМОСТЬ ИСПЫТАНИЙ
- JUnit 4.4 http://sourceforge.net/project/showfiles.php?group_id=15278 плюс вышеупомянутые зависимости отмечают, что зависимость junit должна быть помещена в каталог ANT_HOME/lib