我正在尝试将使用 Tika 的 Java 应用程序从 OracleJDK 1.8 迁移到 OPenJDK 13。
我的 IDE 是 Eclipse。
我创建了该文件module-info.java
以指示我的应用程序所需的模块。
为了能够使用 , 等 Tika 类AbstractParser
,Detector
我requires 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.java
:Eclipse 建议截图。
当我将此模块要求添加到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.Parser
tika-parsers-1.42.1.jar I can see the entry
org.apache.tika.parser.external.CompositeExternalParser` 但包不包含此类。
所以,这似乎是这个 META-INF 文件中的错误。这是因为编译包并将其提交到 Maven Central 时出现错误吗?
我发现了一个 JIRA 问题TIKA-2929,他们说“Apache Tika 需要位于 Java 类路径上,而不是模块路径上”。我已经尝试过了,但是,如前所述,如果我不将它添加到模块路径并设置requires org.apache.tika.parsers;
.
这是一个很难的谜题...