Разделенный пакет Lucene: модуль считывает пакет 'org.apache.lucene.analysis.standard' из 'lucene.analyzers.common' и 'lucene.core'

Учитывая мой модуль-info.java:

module my_module {
    requires lucene.analyzers.common;
    requires lucene.core;
}

Я получаю следующую ошибку:

Модуль 'my_module' считывает пакет 'org.apache.lucene.analysis.standard' из 'lucene.analyzers.common' и 'lucene.core'

В моем коде я использую следующий импорт:

// import from lucene.analyzers.common
import org.apache.lucene.analysis.util.TokenizerFactory;
// import from lucene.core
import org.apache.lucene.analysis.TokenStream;

Как можно решить эту проблему с разделенным пакетом?

0 ответов

Как вы, возможно, уже знаете, Lucene не поддерживает систему модулей платформы Java должным образом, поэтому он не определяет модули и содержит разделенные пакеты, которые плохо работают с модульной системой.

Однако есть обходной путь, позволяющий использовать Lucene в проектах JPMS. Точный способ его реализации зависит от конкретной среды сборки, и я не знаю, как она настроена, но, тем не менее, основная идея одинакова для любой среды сборки. Руководство по миграции Lucene дает первую подсказку (выделено мной):

Если вы переносите свой проект на модульную систему Java 9 Jigsaw, имейте в виду, что Lucene в настоящее время еще не поддерживает объявления module-info.java поставщика услуг impls (оператор предоставляет). Поэтому рекомендуется хранить весь Lucene в одном Uber-модуле и не пытаться разделить Lucene на несколько модулей. Как только Lucene перейдет на Java 9 в качестве минимального требования, мы будем работать над улучшением этого.

Сохранение всего Lucene в одном модуле ("Uber-Module") означает объединение всех Lucene JAR в один JAR, поэтому поведение Java по умолчанию при назначении автоматического модуля этому uber JAR просто работает, потому что uber JAR содержит объединенные разделенные пакеты. В качестве быстрого и грязного решения вы можете настроить сценарий оболочки для слияния Lucene JAR в один перед сборкой, но лучше интегрировать этот шаг в процесс сборки.

Например, чтобы сделать это в Maven, вы должны сначала создать модуль Maven внутри своего проекта Maven, чтобы модуль имел ваш проект Maven в качестве своего родителя. После этого необходимо настроить плагин зависимостей и затенения созданного модуля так, чтобы полученный JAR содержал все используемые вами библиотеки Lucene. Затем вы объявляете этот модуль Maven как зависимость внутри вашего проекта. Для получения более подробных инструкций и обсуждения см. https://www.reddit.com/r/javahelp/comments/8v914c/using_nonmodule_library_lucene_in_java_10_project/, https://lucene.472066.n3.nabble.com/Java-9-issues-td4348032.html и Затенение зависимости в Maven.

Другие вопросы по тегам