Lucene 拆分包:模块从 'lucene.analyzers.common' 和 'lucene.core' 中读取包 'org.apache.lucene.analysis.standard'

Lucene split package: module reads package 'org.apache.lucene.analysis.standard' from both 'lucene.analyzers.common' and 'lucene.core'

鉴于我的 模块-info.java:

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

我收到以下错误:

模块 'my_module' 从 'lucene.analyzers.common' 和 'lucene.core'

中读取包 'org.apache.lucene.analysis.standard'

在我的代码中,我使用了以下导入:

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

如何解决这个拆分包问题?

您可能已经知道,Lucene 不正确支持 Java 平台模块系统,因此它不定义模块并包含拆分包,这与模块系统不能很好地配合使用。

但是,有一种变通方法允许在 JPMS 项目中使用 Lucene。实现它的确切方法取决于您的特定构建环境,我不知道您的构建环境是如何设置的,但是对于任何构建环境,基本思想都是相同的。 Lucene migration guide 提供了第一条线索(强调我的):

If you are migrating your project to Java 9 Jigsaw module system, keep in mind that Lucene currently does not yet support module-info.java declarations of service provider impls (provides statement). It is therefore recommended to keep all of Lucene in one Uber-Module and not try to split Lucene into several modules. As soon as Lucene will migrate to Java 9 as minimum requirement, we will work on improving that.

将所有 Lucene 保存在一个模块(“Uber-Module”)中意味着将所有 Lucene JAR 组合在一个 JAR 中,因此将自动模块分配给该 uber JAR 的默认 Java 行为可以正常工作,因为超级 JAR 包含合并的拆分包。作为一种快速而肮脏的解决方案,您可以设置一个 shell 脚本以在构建之前将 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://lists.apache.org/thread/ydrdwx63t80n7hsbz51467lp9z8w75tk and