IntelliJ中的Java模块并添加require java.ws.rs会产生奇怪的错误

问题描述

我们有直到最近才在JDK8上使用的Maven应用程序。我们刚刚将它们升级到JDK11,并通过将实用程序库转换为模块来尝试利用JDK9的JPMS。

我们最初有这样的路径:

utils/some-library1/src/main/java/com/company/team/utils/lib1/Util1.java

java是“源根”。

因此,一位同事将module-info.java文件放在lib1文件夹中,并这样声明了它:

module utils.lib1 {
    exports com.company.team.utils.lib1;
}

在构建和运行的命令行中,因此他假定一切都与模块有关。

但是当我在Intellij中打开时,它有一条难看的红线,并且提示我应该将其移至源root。然后将其移动到上面的“ java”文件夹中。足够公平。

这使我开始四处寻找有关我的同事已实施的JPMS的更多信息。经过大量搜索和实验,我还确定应将“ java”文件夹(作为“ source root”)重命名为模块的名称(“ utils.lib1”)。所以现在我有了这两个文件

utils/some-library1/src/main/utils.lib1/module-info.java
utils/some-library1/src/main/utils.lib1/com/company/team/utils/lib1/Util1.java

甚至Intellij也很高兴。万岁!因此,我重构了所有其他库。突然,我在一行中遇到了一个重大障碍,那就叫它lib2:

module utils.lib2 {
    exports com.company.team.utils.lib2;
    requires java.ws.rs;
}

Intellij再次用红色错误代码标记模块,这一次是:

模块'utils.lib2'从'jakarta.activation'和'jakarta.activation'中读取包'javax.activation'

我做了一些挖掘,发现了以下内容

java.ws.rs引入以下之一(取决于哪个应用程序):

  • javax.ws.rs-api-2.1.1.jar
  • jakarta.ws.rs-api-2.1.6.jar

它们的module-info.java文件包含以下行:

requires transitive java.xml.bind;

其中之一:

  • jakarta.xml.bind-api-2.3.2.jar
  • jakarta.xml.bind-api-2.3.3.jar
  • jaxb-api-2.4.0-b180830.0359.jar

谁都有这行:

requires transitive jakarta.activation;

这就是我放弃的地方。我们的库是繁重的事情,很难完全解析,因此为简化起见,我创建了一个仅包含一个类的Maven应用,并且所做的只是导入javax.ws.rs.core.Link。

并且IntelliJ仍然给出了我无法弄清的疯狂错误,并且Google一直坚决拒绝告诉我。

是真的坏了还是Intellij和我一样困惑?

我讲了很长的一段话,既展示了我们所做的事情,又让您知道我对模块非常陌生。因此,如果这很简单,请原谅。我只是被困住了。

此外,可以在命令行执行任何明显的测试来验证模块配置吗?

我与jdeps,javac的运气不一致,并且实际上是问题的征兆。

我怀疑事情现在只能奏效,因为它们都在未命名的模块中。但是,如果我要说服任何人进行更改,我需要使一切正常。

编辑

据报告此问题已回答,但这是不正确的。建议的链接涉及两个导入X的不同软件包(A&B)。但在我的情况下,错误 same 软件包(A&A)导入软件包。 X。这是向下进行一些传递的,所以我无法控制导入,也看不到如何进行排除。另外,只需在module-info.java中使用单个require语句就可以重复此问题!

另外,这里还有一个尚未解决的重要的第二个问题:如何从命令行验证模块配置(根本不涉及IDE)。

解决方法

我还确定应将“ java”文件夹(作为“源根”)重命名为模块名称

不,不应该。 java源根目录应保留不变,但是您必须创建与模块名称相对应的软件包名称,因此它应该是/src/main/java/-源根目录,然后是utils/lib1目录-whidh包装。

,

我在Intellij中遇到了完全相同的警告,它是真实的。就我而言,冲突来自使用相同模块名称(即“ jakarta.activation”)的三个独立的依赖项:

  • 'jakarta.activation:jakarta.activation-api:1.2.2'
  • 'javax.activation:javax.activation-api:1.2.0'
  • 'com.sun.activation:jakarta.activation:1.2.2'

通过对排除最后两个依赖项的显式排除,为我的项目解决了这个问题。