我们有一些maven应用程序,直到最近还在JDK8上。我们刚刚将它们升级到JDK11,并试图通过将我们的实用程序库制作成模块来利用JDK9中的JPMS。
我们最初有这样的路径:
utils/some-library1/src/main/java/com/company/team/utils/lib1/Util1.java
其中CCD_;源根";。
因此,一位同事将module-info.java文件放在lib1文件夹中,并这样声明:
module utils.lib1 {
exports com.company.team.utils.lib1;
}
从构建和工作的命令行来看,所以他认为一切都是模块化的。
但当我在Intellij中打开时,它有一条难看的红线,消息说我应该把它移到源根目录。然后它将其移动到";java";文件夹。很公平。
这让我四处挖掘,试图了解更多关于我同事实现的JPMS的信息。经过大量的探索和实验,我也确定了;java";文件夹,作为";源根";,应该重命名为模块的名称("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"one_answers"jakarta.ectivation"读取包"javax.activation">
我做了一些挖掘,发现了以下内容:
java.ws.rs引入以下内容之一(取决于哪个应用程序(:
- javax.ws.rs-api-2.1.1.jar
- 雅加达ws.rs-api-2.1.6.jar
他们的module-info.java
文件包含以下行:
requires transitive java.xml.bind;
其中之一是:
- 雅加达.xml.bind-api-2.3.2.jar
- 雅加达.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仍然给出了我无法理解的疯狂错误,谷歌一直坚决拒绝告诉我
它真的坏了吗?还是Intellij和我一样困惑
我讲了这么长的故事,既是为了展示我们所做的,也是为了让你知道我对模块非常陌生。所以,如果这是一件简单的事情,请原谅我。不过我只是被难住了。
此外,是否可以在命令行执行任何明显的测试来验证模块配置
我在jdeps、javac和实际作为问题指示器运行方面遇到了不稳定的运气。
我的怀疑是,事情现在才起作用,因为它们都在未命名的模块中。但如果我想说服任何人改变它,我需要让一切正常工作。
编辑
据报道,这个问题已经得到回答,但这是不正确的。建议的链接处理两个不同的包(A&B(导入包X。但在我的情况下,错误是相同的包(A&&;A(导入了包X。这是向下进行的一些转换,所以我无法控制导入,也看不到如何进行排除。此外,在module-info.java中只需一个requires语句就可以重复出现这个问题!
此外,还有第二个同样重要的问题尚未解决:如何从命令行验证模块配置(根本不涉及IDE(。
我还确定;java";文件夹,作为";源根";,应重命名为模块的名称
不,不应该。java
源根目录应该保持原样,但您必须创建一个与模块名称相对应的包名称,因此它应该是/src/main/java/
源根目录,然后是utils/lib1
目录,而这将是包。
我在Intellij中遇到了完全相同的警告,它是真实的。在我的案例中,冲突来自使用相同模块名称(即"jakarta.activation"(的三个独立依赖项:
- '雅加达。激活:雅加达。激活api:1.2.2'
- 'javax.activation:javax.activation api:1.2.0'
- 'com.sun.activation:jakarta.activation:1.2.2'
它通过对依赖项应用显式排除来解决我的项目中的问题,而依赖项是最后两个。