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

时间:2019-08-22 10:48:20

标签: java lucene jigsaw

给出我的 module-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;

如何解决此拆分包问题?

1 个答案:

答案 0 :(得分:3)

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

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

如果要将项目迁移到Java 9 Jigsaw模块系统,请记住,Lucene当前尚不支持服务提供者impls的module-info.java声明(provides语句)。 因此,建议将所有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项目作为其父级。完成此操作后,必须配置所创建模块的依赖项和阴影插件,以便生成的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.htmlShading a dependency in Maven