IntelliJ中的Java模块和添加requirejava.ws.rs会出现奇怪的错误



我们有一些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'

它通过对依赖项应用显式排除来解决我的项目中的问题,而依赖项是最后两个。

相关内容

  • 没有找到相关文章

最新更新