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

htm*_*oia 4 java lucene java-platform-module-system

鉴于我的module-info.java

module my_module {
    requires lucene.analyzers.common;
    requires lucene.core;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

模块“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;
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lez 5

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

但是,有一种变通方法允许在 JPMS 项目中使用 Lucene。实现它的确切方法取决于您的特定构建环境,我不知道您的环境是如何设置的,但无论如何,任何构建环境的基本思想都是相同的。的Lucene的迁移指南提供第一线索(重点煤矿):

如果您要将项目迁移到 Java 9 Jigsaw 模块系统,请记住,Lucene 目前尚不支持服务提供者 impls(提供声明)的 module-info.java 声明。因此,建议将所有 Lucene 保留在一个 Uber-Module 中,而不是尝试将 Lucene 拆分为多个模块。一旦 Lucene 作为最低要求迁移到 Java 9,我们将致力于改进它。

将所有 Lucene 保存在一个模块中(“Uber-Module”)意味着将所有 Lucene JAR 组合在一个 JAR 中,因此将自动模块分配给该 uber JAR 的默认 Java 行为就可以正常工作,因为 uber JAR 包含合并的拆分包. 作为一种快速而肮脏的解决方案,您可以设置一个 shell 脚本,在构建之前将 Lucene JAR 合并为一个,但在构建过程中集成该步骤是一个更好的主意。

例如,要在 Maven 中执行此操作,您应该首先在 Maven 项目中创建一个 Maven 模块,以便该模块将您的 Maven 项目作为其父项。完成后,必须配置所创建模块的依赖项和 shade 插件,以便生成的 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 中着色依赖项