Компиляция приложения с помощью Tika с Java 13 - проблемы с загрузкой модулей

Я пытаюсь перенести приложение Java, использующее Tika, с 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) являются модульными: Путь сборки Java для Eclipse

В заключение: если я не добавлю 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.

[email protected] 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 для парсеров сформирован неправильно? Есть ли обходной путь для этого?

Спасибо.

EDIT: Если я попробую версию 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.jarI can see the entryorg.apache.tika.parser.external.CompositeExternalParser`, но пакет не содержит этого класса.

Итак, похоже, ошибка в этом файле META-INF. Это связано с ошибкой при компиляции пакета и отправке его в Maven Central?

Я нашел проблему JIRA, TIKA-2929, где говорится " Apache Tika должен находиться в пути к классам Java, а не в пути к модулю». Я пробовал это, но, как объяснялось ранее, я получаю ошибку компиляции, если не добавляю ее в путь к модулю и не устанавливаю requires org.apache.tika.parsers;.

Это трудная головоломка...


person Mbr    schedule 05.06.2020    source источник
comment
Устранено (но не решено) в issues.apache.org/jira/browse/TIKA-2929   -  person Naman    schedule 05.06.2020
comment
Путь модуля Java не подходит для долгоживущих модулей, поддерживающих несколько версий Java. Почему бы просто не использовать путь к классам?   -  person Gagravarr    schedule 07.06.2020
comment
Возможно я ошибаюсь, но когда я пытаюсь установить его просто в пути к классам, код не компилируется. Ошибка PDFParserConfig cannot be resolved to a type.   -  person Mbr    schedule 08.06.2020
comment
Вам все еще нужно импортировать класс в свой код Java   -  person Gagravarr    schedule 08.06.2020
comment
В Eclipse (Properties/Java Build Path) я вижу, что Classpath содержит зависимости Maven, а внутри него tika-parsers-1.41.1.jar указан. Я понимаю, что это означает, что эта банка включена в путь к классам. Однако для разрешения PDFParserConfig Eclipse требует, чтобы я добавил модуль org.apache.tika.parsers в module-info.java. Если я это сделаю, он скомпилируется. Однако при выполнении я получаю сообщение об ошибке, указывающее, что дескриптор модуля не может быть получен из tika-parsers-1.24.1.jar.   -  person Mbr    schedule 09.06.2020


Ответы (1)


Столкнулись с теми же проблемами.
Также обнаружены ошибочные записи в
org.apache.tika.parser.Parser (а также org.apache.tika.parser.Detector) в META-INF/services/

Быстрое решение состоит в том, чтобы...

  • Распаковать эти файлы
  • удалите строки, которые, кажется, ссылаются на несуществующие классы
  • упакуйте их обратно в банку

Мой проект скомпилирован после этого.
Конечно, это не долгосрочное решение, но поскольку даже старые версии, которые я пробовал, сталкивались с этой проблемой, это может помочь некоторым людям.

person FrogJ    schedule 17.07.2020