Eclipse m2e不支持JPMS模块的Maven测试罐

问题描述 投票:1回答:1

我有一个项目'java11-core',该项目生成一个测试jar工件以与项目'java11-app'共享。这些项目可以使用命令行Maven很好地构建,但是在Eclipse中,找不到在测试jar中共享的类。

版本信息:

  • Apache Maven 3.6.0(命令行和Eclipse)
  • Java版本:11.0.1,供应商:Oracle Corporation
  • Eclipse IDE:版本:2018-09(4.9.0)
  • M2E插件:1.9.1.20180912-1601

我最初将这些项目创建为传统的非JPMS项目。这些项目通常按预期进行编译和运行测试。在将module-info.java添加到java11-core和java11-app之后,Eclipse编译器无法识别核心项目中的共享测试文件。

这里是软件包浏览器的快照,用于项目结构的概述。

enter image description here

分别添加的java11-app和java11-core module-info内容:

module com.java11.app {

    exports com.java11.app;
    requires com.java11.core;
}

module com.java11.core {

    exports com.java11.core;
}

如您所见,我没有从com.java11.core中导出测试实用程序包。我不想导出测试包,因为这会使测试类公开可用。我也不想引入一个新的测试项目,因为在现实情况下,这很可能需要测试实用程序与其协助进行测试的项目之间的循环依赖。

enter image description here

在AppTest.java中为构建错误。 Eclipse报告的失败很有趣,因为它并不声称它找不到CoreTestUtil类,而是:

The type com.java11.test.core.util.CoreTestUtil is not accessible   AppTest.java    /java11-app/src/test/java/com/java11/app    line 8  Java Problem
CoreTestUtil cannot be resolved                                     AppTest.java    /java11-app/src/test/java/com/java11/app    line 21 Java Problem

[我的假设是,即使该类存在于单独的测试中,该包也无法从java11-core导出,和/或在java11-app中缺少此包的需求,使eclipse相信访问受到限制。 -罐。

java11-app的模块路径显示它包括java11-core作为模块,并且没有测试代码设置为No

enter image description here

我知道我正在使用新发布的功能,并且怀疑尚不支持在Eclipse JPMS项目之间共享测试类。但是,我不确定在哪里可以找到它的更新(Eclipse?M2E插件)。我也不知道有什么变通办法,可以在我为软件项目采用JPMS时提高工作效率。

对于那些认为不应以这种方式共享测试实用程序的人...

此主题的特征是最佳实践问题,应通过将测试实用程序重构为单独的模块来解决。我尊重这个观点,但是在尝试遵循该指导时,我发现自己被迫违反了其他最佳实践,包括DRY(不要重复自己)以及软件包之间的循环依赖关系。

[开发人员在开发一个模块时通常会出现这种情况,该模块既可以帮助对该模块进行有效的测试,也可以依赖于该模块。如果将这些实用程序拉出到单独的模块,则会创建一个周期。此外,其中的一些实用程序在测试依赖于该模块的其他模块时同样有用。如果将这些实用程序复制到依赖项的新测试模块中,则会创建重复的代码。这种推理可能就是为什么最初添加Maven'test-jar'支持的原因。

java eclipse maven m2e module-info
1个回答
0
投票

我完全同意你的看法。当我还可以继承一些src-test功能时,为什么只使用某些核心模块中的src-main代码?

但是如何处理范围问题?当我使用“测试”范围时,我松开了与src-main代码的关系。当我不使用测试范围时,我会松开与src-test代码的关系。

我的核心测试代码不会经常更改,因此要在Eclipse中正常工作我将测试罐安装到本地存储库,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.