0

Tika を使用する Java アプリケーションを OracleJDK 1.8 から OPenJDK 13 に移行しようとしています。

私のIDEはEclipseです。

module-info.javaアプリケーションに必要なモジュールを示すファイルを作成しました。

AbstractParser、などの Tika クラスを使用できるようにするために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.Parsertika-parsers-1.42.1.jar org.apache.tika.parser.external.CompositeExternalParser` を検査I can see the entryしていますが、パッケージにはこのクラスが含まれていません。

ということで、この META-INF ファイルのエラーのようです。これは、パッケージをコンパイルして Maven Central に送信する際のエラーが原因ですか?

JIRA の問題TIKA-2929を見つけました。「Apache Tika は、モジュール パスではなく、Java クラスパス上にある必要があります」と書かれています。これを試してみましたが、前に説明したように、モジュールパスに追加して設定しないと、コンパイルエラーが発生しますrequires org.apache.tika.parsers;

これは難しいパズルです...

4

1 に答える 1