Как решить мою проблему с зависимостями с помощью Maven и slf4j с OWLAPI в Eclipse, пожалуйста

#java #eclipse #maven #owl-api

Вопрос:

Во-первых, я новичок в Maven, поэтому прошу прощения, если я что-то неправильно понял. В недавнем вопросе, который я задал об импорте OWLApi в моем проекте Java, люди посоветовали мне использовать Maven для его импорта вместо импорта файла JAR. Я попробовал новый проект Maven и импортировал его для тестирования OWLApi, и он хорошо работал.

Сегодня для моего профессионального проекта мне удалось поработать с Maven. Я преобразовал свой проект в Maven, добавил OWLApi в свои зависимости… и когда я строю с Maven, я получил ошибку :

 Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError
 

Более того, мои классы больше не компилируются (невозможно запускать мои классы, потому что ни один класс не компилируется).

Если это поможет, это мой pom, где я пытался исключить slf4j, как я обнаружил в другом вопросе. Но мне это не помогло :

   <dependencies>
    <dependency>
    <groupId>net.sourceforge.owlapi</groupId>
    <artifactId>owlapi-distribution</artifactId>
    <version>5.0.0</version>
    <exclusions>
        <exclusion> 
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
        </exclusion>
</exclusions> 
</dependency>
</dependencies>
 

Заранее спасибо.

Комментарии:

1. Вы были исключены из того, что ему нужно. вы должны найти разницу между классами slf. Исключение-очень опасное решение. Не полное решение. внимательно проверьте зависимости. а также скачивайте исходные коды и создавайте свои собственные банки.

2. Привет, можете ли вы подтвердить, что это весь набор зависимостей для вашего проекта? Упомянутые артефакты не отображаются в зависимостях OWLAPI, поэтому исключения не будут работать, и они должны поступать из других зависимостей.

Ответ №1:

Здесь происходит то, что путь к классу содержит два адаптера: один, который передает вызовы ведения журнала, выполненные с помощью Log4J, регистратору SLF4J, и другой, который делает ровно обратное. Если оба они находятся в пути к классу, любой вызов ведения журнала сначала будет отправлен в одну систему ведения журнала, а затем передан в другую, и это создаст бесконечный цикл. Это приведет к переполнению стека, о чем и сообщается в сообщении об ошибке.

OWLAPI не импортирует ни один jar, он импортирует только API SLF4J, поэтому конфликтующие jar должны быть зависимостями других библиотек.

Вы отметили здесь Eclipse, поэтому я предполагаю, что вы используете Eclipse. Когда вы открываете файл pom в Eclipse, вы получаете редактор с вкладками, одной из которых является Иерархия зависимостей. Вы можете использовать эту вкладку для поиска банок, которые вы хотите исключить, вкладка покажет, какие из ваших зависимостей вводят банки, чтобы вы могли разместить исключения в нужном месте. Должно быть достаточно исключить одну из банок (это зависит от того, какую систему ведения журнала вы собираетесь использовать на самом деле).

Комментарии:

1. Привет. Прежде всего, спасибо за ваш ответ, я действительно ценю его ! И извините за время, которое я потратил на ответ, я был очень занят в эти дни… Итак, в проекте мы используем geotools (мы использовали банку, но теперь я добавил ее с Maven). В пути к классу я использую банки Graphsteam. До того, как я попытался импортировать OWLAPI и использовал Maven, все остальное работало хорошо. Так что я не понимаю, в чем здесь проблема… Я нажал на вкладку, которую вы мне сказали (Иерархия зависимостей), и единственный раз, когда появляется sl4j,-это sl4j-api, используемый в owlapi, и его зависимости (jcl-over…, jsonld-java, sesame-util). Что я пропустил, пожалуйста ?

2. Если в зависимостях maven нет других вхождений, это должно быть связано с тем, что ошибка исходит из другого пути к классу, например, если код, который вы запускаете, проходит настройку проекта eclipse и не синхронизирован с настройками maven. Убедитесь, что проект помечен как проект maven, щелкните его правой кнопкой мыши и выберите maven/обновить проект. В противном случае нам нужно будет просмотреть содержимое файла .classpath в проекте.

3. Ошибка при построении Maven : «SLF4J: Путь к классу содержит несколько привязок SLF4J. SLF4J: Найдена привязка в [jar:file:/…/.p2/pool/plugins/org.eclipse.m2e.maven.runtime.slf4j.simple_1.18.0.20210618-2246/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Найдена привязка в [file:/…/eclipse/java-2021-09/eclipse/configuration/org.eclipse.osgi/5/0/.cp/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Смотри slf4j.org/codes.html#multiple_bindings для объяснения. SLF4J: Фактическая привязка имеет тип [org.slf4j.impl.SimpleLoggerFactory]»

4. Мой путь построения содержит только 2 проекта java, которые не используют Maven. Сейчас в моем основном проекте я использую maven для импорта геотуалов. В одном из импортируемых мной java-проектов он использует банку с геотулами. Это, наверное, проблема ? Должен ли я рекомендовать сопровождающему этого проекта использовать maven, чтобы избежать конфликтов с моим проектом, который недавно использует Maven ?

5. Я только что попытался создать новый новый проект maven с Api OWL в качестве единственного импорта. У меня то же самое : SLF4J: Путь к классу содержит несколько привязок SLF4J. SLF4J: Найдена привязка в [jar:file:/…/.p2/pool/plugins/org.eclipse.m2e.maven.runtime.slf4j.simple_1.18.0.20210618-2246/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Найдена привязка в [file:/…/eclipse/java-2021-09/eclipse/configuration/org.eclipse.osgi/5/0/.cp/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Смотри slf4j.org/codes.html#multiple_bindings для объяснения.