我正在通过 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。以前,她总是因为 Tika 自己抛出的异常而进入第一次捕获,在我添加一些库或更改 pom.xml 中的某些内容后,她没有从 tika 捕获异常,而是进入第二次捕获并捕获另一个异常. 我阅读了 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
那么问题来了,你如何使用这个 slf4j 的 2 或 3 个库,或者你如何给这些链接的库提供他们需要的 slf4j 库的版本?一般来说,这样的版本冲突情况如何解决呢?请让我知道解决此问题的最佳方法是什么。预先感谢您的理解。
这个问题的一种可能的解决方案:首先,让我们尝试删除重复和不必要的库。例如,在我的 pom.xml 中重复了 tika-app。然后我运行命令:
我看到了依赖树。它显示了哪些 jars(使用哪个版本)正在使用 slf4j 库。我最需要的图书馆是
org.apache.Tika:tika-app (v1.25)
. 她在里面使用:我将它们带到了 tika-app 想要的一个版本 1.7.28。之后,我开始查看其他想要版本低于 1.7.28 的库。为了消除版本冲突,我在 pom.xml 中为每个此类库添加了以下依赖项:
例如对于
我在 pom.xml 中添加:
我为每个想要 slf4j 版本低于我在 pom.xml 中指定的版本的库执行此操作。