问题描述
我们有直到最近才在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;
}
模块'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'
通过对排除最后两个依赖项的显式排除,为我的项目解决了这个问题。