给定我的 * 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;
如何解决这个拆分 Package 的问题?
1条答案
按热度按时间oyxsuwqo1#
正如您可能已经知道的,Lucene并不正确地支持Java平台模块系统,因此它没有定义模块,并且包含拆分包,这些拆分包不能很好地与模块系统一起工作。
然而,有一个变通方案允许在JPMS项目中使用Lucene。实现它的确切方式取决于您特定的构建环境,我不知道您的构建环境是如何设置的,但基本思想对于任何构建环境都是相同的。Lucene migration guide提供了第一条线索(强调我的):
如果您要将项目迁移到Java 9 Jigsaw模块系统,请记住Lucene目前还不支持module-info.java服务提供者impls的www.example.com声明**因此建议将所有Lucene都放在一个Uber-Module中,而不要尝试将Lucene分成几个模块。**只要Lucene将迁移到Java 9作为最低要求,我们将努力改进这一点。
将所有Lucene保存在一个模块中(“Uber-Module”)意味着将所有的Lucene JAR合并到一个JAR中,所以默认的Java行为是将一个自动模块分配给这个UberJAR,因为这个UberJAR包含了合并后的拆分包。作为一个快速而简单的解决方案,您可以在构建之前设置一个shell脚本将Lucene JAR合并到一个JAR中,但是将该步骤集成到构建过程中是一个更好的主意。
例如,要在Maven中实现这一点,首先应该在Maven项目中创建一个Maven模块,必须配置所创建模块的依赖项和shade插件,以使生成的JAR包含您使用的所有Lucene库。有关详细说明和讨论,请参阅https://www.reddit.com/r/javahelp/comments/8v914c/using_nonmodule_library_lucene_in_java_10_project/、https://lists.apache.org/thread/ydrdwx63t80n7hsbz51467lp9z8w75tk和Shading a dependency in Maven。