Java Как использовать 2 или 3 версии slf4j в своей программе?

собираю проект через maven, использую Windows8 с NetBeans. У меня есть код:

           try (InputStream is = new BufferedInputStream(new FileInputStream(newStr))){
                
                String mimeType = tika.detect(is); //определяем mimeType нашего документа
                metadata.set(Metadata.CONTENT_TYPE, mimeType);//устанавливаем mimeType
                
                AutoDetectParser parser = new AutoDetectParser();
                ParseContext pc = new ParseContext(); 
                ContentHandler ch = new BodyContentHandler(-1); 
                parser.parse(is, ch, metadata, pc); //разбор файла на части

           } catch (IOException | SAXException | TikaException ex) {

                System.out.println("Exception of Tika");

           } catch (Throwable th) {
               System.out.println(th.getMessage());
                th.printStackTrace();
                System.out.println("catch");

При выполнении операции на строчке - parser.parse(is, ch, metadata, pc). Программа не может обработать файл и начинает переходить в catch. Раньше она всегда заходила в первый catch из-за exception, которые бросала сама Tika, после того как я добавил библиотеку какую-то или что-то поменял в pom.xml, она не ловит exception от tika, а идет во 2-ой catch и ловит другой exception. Я прочитал th.printStackTrace() и увидел такое сообщение:

org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:131)
    at org.apache.fontbox.ttf.GlyphSubstitutionTable.readLookupTable(GlyphSubstitutionTable.java:263)
    at org.apache.fontbox.ttf.GlyphSubstitutionTable.readLookupList(GlyphSubstitutionTable.java:231)
    at org.apache.fontbox.ttf.GlyphSubstitutionTable.read(GlyphSubstitutionTable.java:80)
    at org.apache.fontbox.ttf.TrueTypeFont.readTable(TrueTypeFont.java:353)
    at org.apache.fontbox.ttf.TTFParser.parseTables(TTFParser.java:173)

...

После я залез в mav dependency:tree и увидел, что некоторые версии slf4j конфликтуют между собой. Определенные библиотеки хотят использовать старую версию, а не ту которую я указываю в своем pom.xml.


Мой новый pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>StackExp</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <tika>1.2</tika>
    </properties>
    
    <dependencies>
        
        <!-- catch-throwable для отлавливания exception-->
        <dependency>
            <groupId>eu.codearte.catch-exception</groupId>
            <artifactId>catch-throwable</artifactId>
            <version>1.4.4</version>
        </dependency>       

        <!-- commons-lang3: для замера времени-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.11</version>
        </dependency>
        
        <!-- jdom: для чтения файла task.xml-->
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.0</version>
            <type>jar</type>
        </dependency>
        
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>1.25</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika</artifactId>
            <version>1.25</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.Tika</groupId>
            <artifactId>Tika-serialization</artifactId>
            <version>1.25</version>
        </dependency> 
        <dependency>     
            <groupId>org.apache.Tika</groupId>
            <artifactId>tika-app</artifactId>
            <version>1.25</version>
        </dependency>  
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parsers</artifactId>
            <version>1.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-app</artifactId>
            <version>2.0.21</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.22</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>3.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-artifact</artifactId>
            <version>3.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-project</artifactId>
            <version>2.2.1</version>
        </dependency>     
        <dependency>
            <groupId> org.apache.cassandra</groupId>
            <artifactId>cassandra-all</artifactId>
            <version>0.8.1</version>
        </dependency>
        
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>5.0.0</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>biz.aQute</groupId>
            <artifactId>bndlib</artifactId>
            <version>1.50.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>jbig2-imageio</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.22</version>
        </dependency>
        
        <!-- Test dependencies -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.28</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.28</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.28</version>
        </dependency>
        
        <!-- New1-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>1.7.28</version>
        </dependency>
        <!-- New2 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.28</version>
        </dependency>


        
        <dependency>
            <groupId>com.github.jai-imageio</groupId>
            <artifactId>jai-imageio-core</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.jai-imageio</groupId>
            <artifactId>jai-imageio-jpeg2000</artifactId>
            <version>1.4.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.github.jai-imageio</groupId>
                    <artifactId>jai-imageio-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.34.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>xmpbox</artifactId>
            <version>2.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-tools</artifactId>
            <version>2.0.19</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-debugger</artifactId>
            <version>2.0.22</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>ome</groupId>
            <artifactId>bio-formats</artifactId>
            <version>5.0.0-rc2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>preflight</artifactId>
            <version>2.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>jempbox</artifactId>
            <version>1.8.16</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>


        <!-- Helper's dependencies -->
        <dependency>
            <groupId>org.gagravarr</groupId>
            <artifactId>vorbis-java-tika</artifactId>
            <version>0.1</version>
        </dependency>
        
        
        <dependency>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
            <version>1.4.4</version>
        </dependency>
        
        
    </dependencies>

    <build>
        <plugins>
               
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.mycompany.stackexp.Parser</mainClass>
                       
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
                      
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.mycompany.stackexp.Parser</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Например в mvn dependency:tree я могу увидеть:

[INFO] |  |  |  +- com.intellij:annotations:jar:12.0:compile
[INFO] |  |  |  \- (org.slf4j:slf4j-api:jar:1.7.6:compile - omitted for conflict with 1.7.28)
[INFO] |  |  +- (commons-cli:commons-cli:jar:1.4:compile - omitted for conflict with 1.1)
[INFO] |  +- (org.slf4j:slf4j-log4j12:jar:1.7.28:compile - omitted for conflict with 1.7.25)
[INFO] |  +- (org.gagravarr:vorbis-java-tika:jar:0.8:compile - omitted for conflict with 0.1)
[INFO] |  +- org.tallison:jmatio:jar:1.5:compile
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.25:compile - omitted for conflict with 1.7.28)
[INFO] |  +- com.epam:parso:jar:2.0.12:compile
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.5:compile - omitted for conflict with 1.7.25)
[INFO] |  +- (org.apache.pdfbox:pdfbox:jar:2.0.21:compile - omitted for conflict with 2.0.22)
[INFO] |  +- (org.apache.pdfbox:pdfbox-tools:jar:2.0.21:compile - omitted for conflict with 2.0.19)
[INFO] |  +- (org.apache.pdfbox:preflight:jar:2.0.21:compile - omitted for conflict with 2.0.22)
[INFO] |  +- (org.apache.pdfbox:jempbox:jar:1.8.16:compile - omitted for duplicate)
[INFO] |  +- (org.apache.pdfbox:xmpbox:jar:2.0.21:compile - omitted for conflict with 2.0.22)
[INFO] |  +- org.tallison:isoparser:jar:1.9.41.4:compile
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.30:compile - omitted for conflict with 1.7.25)
[INFO] |  +- com.rometools:rome:jar:1.15.0:compile
[INFO] |  |  +- com.rometools:rome-utils:jar:1.15.0:compile
[INFO] |  |  |  \- (org.slf4j:slf4j-api:jar:1.7.16:compile - omitted for conflict with 1.7.25)
[INFO] |  |  +- (org.jdom:jdom2:jar:2.0.6:compile - omitted for duplicate)
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.16:compile - omitted for conflict with 1.7.25)
[INFO] |  +- com.github.junrar:junrar:jar:7.4.0:compile
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.9:runtime - omitted for conflict with 1.7.25)
[INFO] |  +- (org.slf4j:slf4j-api:jar:1.7.28:compile - omitted for conflict with 1.7.25)
[INFO] |  |  +- (net.jcip:jcip-annotations:jar:1.0:compile - omitted for duplicate)
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.7:compile - omitted for conflict with 1.7.28)
[INFO] |  +- edu.ucar:grib:jar:4.5.5:compile
[INFO] |  |  +- (edu.ucar:cdm:jar:4.5.5:compile - omitted for duplicate)
[INFO] |  |  +- (org.slf4j:slf4j-api:jar:1.7.7:compile - omitted for conflict with 1.7.28)

Полное сообщение этого дерева можно увидеть в файле - https://dropmefiles.com/SMjrP


И поэтому такой вопрос, как можно использовать 2 или 3 библиотеки этого slf4j, или как можно дать этим подключенным библиотекам нужные им версии библиотеки slf4j? Вообще как можно решить такую ситуацию конфликта версий? Подскажите какие есть подходы в решении такой задачи. Заранее спасибо за понимание.


Ответы (1 шт):

Автор решения: Evendie

Один из возможных вариантов решения данной проблемы: сначала попробуем убрать повторяющиеся и ненужные библиотеки. Например в моем pom.xml повторялся tika-app. Затем я выполнил команду:

mvn dependency:tree -Dverbose -Dincludes=slf4j

И увидел дерево зависимостей. В нем было показано какие jar (с какой версией) использует в библиотеку slf4j. Самой нужной для меня библиотекой была org.apache.Tika:tika-app (v1.25). Внутри она использовала:

org.slf4j:slf4j-log4j12:jar    
org.slf4j:jcl-over-slf4j:jar
org.slf4j:jul-to-slf4j:jar

Я привел их к одной версии 1.7.28, которую хотел иметь tika-app. После этого стал смотреть на другие библиотеки, которые хотели версию меньше 1.7.28. Для того, чтобы убрать конфликт версия я для каждой такой библиотеки добавил такую зависимость в pom.xml:

например для

[INFO] |  +- org.tallison:jmatio:jar:1.5:compile
[INFO] |  |  \- (org.slf4j:slf4j-api:jar:1.7.25:compile - omitted for conflict with 1.7.28)

я добавляю в pom.xml:

    <dependency>
        <groupId>org.tallison</groupId>
        <artifactId>jmatio</artifactId>
        <version>1.5</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Так делаю для каждой библиотеки, которая хочет иметь slf4j с версией меньше, чем моя указанная в pom.xml.

→ Ссылка