0

我正在尝试将使用 Tika 的 Java 应用程序从 OracleJDK 1.8 迁移到 OPenJDK 13。

我的 IDE 是 Eclipse。

我创建了该文件module-info.java以指示我的应用程序所需的模块。

为了能够使用 , 等 Tika 类AbstractParserDetectorrequires org.apache.tika.core;module-info.java.

我的代码还使用该类org.apache.tika.parser.pdf.PDFParserConfig来提取嵌入的图像:

PDFParserConfig pdfConfig = new PDFParserConfig();
pdfConfig.setExtractInlineImages(true);
context.set(PDFParserConfig.class, pdfConfig);'

我得到编译错误:

PDFParserConfig cannot be resolved to a type

Eclipse 建议添加requires org.apache.tika.parsers;module-info.javaEclipse 建议截图

当我将此模块要求添加到module-info.java时,应用程序会正确编译。

也就是说,在这个阶段我们已经包含在module-info.java

module myapp {
    /** others ... */ 
    requires org.apache.tika.core;
    requires org.apache.tika.parsers;
}

但是,当尝试执行编译后的应用程序时,我们会收到错误消息:

Error occurred during initialization of boot layer
java.lang.module.FindException: Unable to derive module descriptor for C:\Users\Admin\.m2\repository\org\apache\tika\tika-parsers\1.24\tika-parsers-1.24.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class org.apache.tika.parser.onenote.OneNoteParser not in module

在 Eclipse 中检查项目库,我可以看到 tika-core 和 tika-parsers (v1.24) 都是模块化的:Eclipse Java Build Path

总之:如果我不添加org.apache.tika.parsers为必需模块,应用程序将无法编译,如果我添加它,我会收到运行时错误org.apache.tika.parser.onenote.OneNoteParser,说不在模块中。

我检查了这些包的 JAR 文件以查看它们的依赖关系。核心包似乎是正确的:

$ jar --file=tika-core-1.24.jar --describe-module

No module descriptor found. Derived automatic module.

org.apache.tika.core@1.24 automatic
requires java.base mandated
contains org.apache.tika
contains org.apache.tika.concurrent
contains org.apache.tika.config
contains org.apache.tika.detect
contains org.apache.tika.embedder
contains org.apache.tika.exception
contains org.apache.tika.extractor
contains org.apache.tika.fork
contains org.apache.tika.io
contains org.apache.tika.language
contains org.apache.tika.language.detect
contains org.apache.tika.language.translate
contains org.apache.tika.metadata
contains org.apache.tika.mime
contains org.apache.tika.parser
contains org.apache.tika.parser.digest
contains org.apache.tika.parser.external
contains org.apache.tika.sax
contains org.apache.tika.sax.xpath
contains org.apache.tika.utils

...但是“解析器”jar 给出了一个错误:

$ jar --file=tika-parsers-1.24.jar --describe-module

Unable to derive module descriptor for: tika-parsers-1.24.jar
Provider class org.apache.tika.parser.onenote.OneNoteParser not in module

这是否意味着解析器的 jar 包格式不正确?有什么解决方法吗?

谢谢你。

编辑: 如果我尝试使用版本 1.24.1,我会收到执行错误:

Error occurred during initialization of boot layer
java.lang.module.FindException: Unable to derive module descriptor for C:\Users\Admin\.m2\repository\org\apache\tika\tika-parsers\1.24.1\tika-parsers-1.24.1.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class org.apache.tika.parser.external.CompositeExternalParser not in module

那就是:失败的班级是CompositeExternalParser而不是OneNoreParser

检查META-INF/services/org.apache.tika.parser.Parsertika-parsers-1.42.1.jar I can see the entryorg.apache.tika.parser.external.CompositeExternalParser` 但包不包含此类。

所以,这似乎是这个 META-INF 文件中的错误。这是因为编译包并将其提交到 Maven Central 时出现错误吗?

我发现了一个 JIRA 问题TIKA-2929,他们说“Apache Tika 需要位于 Java 类路径上,而不是模块路径上”。我已经尝试过了,但是,如前所述,如果我不将它添加到模块路径并设置requires org.apache.tika.parsers;.

这是一个很难的谜题...

4

1 回答 1

1

遇到同样的问题。
还发现了
org.apache.tika.parser.Parser(和org.apache.tika.parser.Detector)中的错误条目META-INF/services/

一个快速的解决方法是...

  • 解压这些文件
  • 删除似乎引用非现有类的行
  • 把它们装回罐子里

我的项目在那之后编译。
肯定没有长期解决方案,但由于我尝试过的旧版本也遇到了这个问题,它可能会帮助一些人。

于 2020-07-17T11:21:12.693 回答