在IntelliJ上将Java 9拆分包错误静音

Iva*_*sco 5 module compiler-errors intellij-idea java-9

我有一个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
Run Code Online (Sandbox Code Playgroud)

IntelliJ发出的编译错误的基本原理是:

  1. solr-coreMaven依赖于工件lucene-misclucene-sandbox
  2. 二者lucene-misc.jarlucene-sandbox.jar定义类在包org.apache.lucene.search
  3. IntelliJ认为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

And*_*sha 4

[短的]

如果您想从模块代码运行应用程序,这是不可能的。您必须将依赖于碰撞 JAR 的代码迁移到非模块代码,并将碰撞 jar 添加到类路径上。(按照评论中的建议)

[长的]

Intellij在幕后尝试运行JVM,因此只有当JVM可以运行时, Intellij才能运行您的应用程序。

当您从模块 jar 运行应用程序时,这意味着您从命名模块运行应用程序。该模块必须需要其所有依赖项,这些依赖项应该是名称模块。请注意,即使是从非模块JAR创建的自动模块也确实被命名。 Java 9出于可靠配置的原因不允许拆分包,只有未命名的模块不受此规则的限制。

使它起作用的唯一方法是将碰撞罐移动到未命名模块,但命名模块不能依赖于未命名模块

事实上,命名模块甚至不能声明对未命名模块的依赖。此限制是有意为之的,因为允许命名模块依赖于类路径的任意内容将使可靠的配置变得不可能。

因此,如果您不想重新打包碰撞 jar,则必须将需要碰撞jar的模块移动到非模块 jar。

你的 Maven 插件就用它完成了,因为正如 @Nicolai 所说:

Maven 将它们放在类路径上(其中拆分包并不重要),而 IntelliJ 将它们放在模块路径上(导致您观察到的问题)。

另请参阅有关从非模块代码运行应用程序的答案