我有一个JDK 9项目。运行mvn install
时,一切正常。当我使用IntelliJ 2017.2.6和JDK 9.0.4时,我出现了
由于拆分包而导致数十个编译错误。例如,在我的POM中,我设置了对org.apache.solr:solr-core:7.2.1
的依赖。 IntelliJ显示的错误之一是:
Error:java: module solr.core reads package org.apache.lucene.search from both lucene.misc and lucene.sandbox
IntelliJ发出的编译错误的基本原理是:
solr-core
对工件lucene-misc
和lucene-sandbox
lucene-misc.jar
和lucene-sandbox.jar
都定义了包org.apache.lucene.search
lucene-misc.jar
和lucene-sandbox.jar
是JDK 9模块(事实上,它们不是模块,它们没有module-info.java
文件)。由于两个JDK 9模块无法参与同一个软件包,因此IntelliJ会发出编译错误。相比之下,Maven编译器插件没有出错,因为它认为lucene-misc.jar
和lucene-sandbox.jar
属于
类路径,而不是模块路径。
我显然不想重新包装Lucene的东西。
所以我的问题归结为以下几点:如何将IntelliJ错误Error:java: module Mod1 reads package P from both Mod2 and Mod3
静音?
答案 0 :(得分:4)
<强> [简要] 强>
如果您想从模块代码运行应用程序,那是不可能的。您必须将依赖于碰撞JAR的代码迁移到非模块 e代码,并在类路径上添加collitions jar。 (如评论中所述)
<强> [长] 强>
在场景后面 Intellij 尝试运行 JVM ,因此 Intellij 只有在 JVM <时才能运行您的应用程序/ em>可以做到这一点。
从模块jar运行应用程序时,这意味着您从命名模块运行应用程序。该模块必须要求其所有依赖项都应该是名称模块。请注意,即使是从非模块 JAR 创建的自动模块也确实已命名。 由于可靠配置的原因, Java 9 不允许 split-packages ,只有未命名模块不在此规则范围内。
使其成功的唯一方法是将碰撞罐移至未命名模块,但named module cannot depend on unnamed module
事实上,命名模块甚至不能声明对未命名模块的依赖。这种限制是有意的,因为允许命名模块依赖于类路径的任意内容将使得不可能进行可靠的配置。
因此,如果您不想重新打包碰撞罐,则必须将需要碰撞 jar 的模块移动到非模块jar。
你的maven插件完成了它,因为@Nicolai说:
Maven将它们放在类路径上(拆分包无关紧要),而IntelliJ将它们放在模块路径上(导致你观察到的问题)。
另请参阅this answer关于从非模块代码运行应用程序。