Java 9模块和JUnit 4

时间:2017-09-27 20:37:04

标签: java eclipse junit4 java-9 jigsaw

Eclipse氧气; Windows 7的; JDK 9决赛9月21日; JUnit 4.12和现有的应用程序。作为起点,可以编译,执行应用程序,并且所有JUnit测试都显示为绿色。现在我们使用eclipse生成文件module-info.java。结果如下:

module ch.commcity.topsort {
   exports ch.commcity.topsort;

   requires junit;
}

但是有错误:junit无法解析为模块。 问题是:如何告诉文件junit没有定义任何模块,它应该在兼容模式下运行?

3 个答案:

答案 0 :(得分:8)

  

如何告诉文件junit没有定义任何模块,它应该以兼容模式运行?

您的问题似乎是基于一些误解:

  • 您无法告诉module-info.java JUnit是否定义了模块。如果一个模块说它需要另一个模块,那么编译器希望该模块存在 - 没办法解决这个问题。
  • JUnit 4是否作为模块出现并不过分重要 - 只要将其放在模块路径上,它最终将被视为模块(可能为an automatic one)。
  • 没有"兼容模式"。您可以像在模块系统之前那样继续编写代码(几乎),但是一旦您创建了模块声明,就需要按照规则进行操作。

我建议您对杰出的State of the Module System进行彻底的阅读,然后问问自己,您究竟想要完成什么。你真的想创建一个依赖于JUnit的模块吗?或者这只是偶然的,因为您使用其API进行测试。如果是后者,则不应该依赖它 - 而是您的IDE /构建工具需要弄清楚如何编译和运行测试。

扩展"依赖于JUnit"

的模块

模块系统不会将依赖关系分类为" compile"或"测试" - 如果模块requires是另一个模块,则必须存在,始终。这意味着requires junit将强制存在JUnit的模块。除非模块提供与测试相关的功能,否则这肯定是错误的。

换句话说,requires junit类似于使用compile scope将JUnit添加到项目的POM中。

答案 1 :(得分:3)

首先,请更新您的Java 9 support for Eclipse Oxygen或使用Eclipse 4.7.1a的最新可用候选版本(将于2017年10月11日发布)。

要在Eclipse中的Java 9项目的模块路径中添加库或容器,请打开项目的 Java Build Path 对话框。在标签上,选择节点模块路径,然后将库添加到该节点。确保首先从 Classpath 节点中删除该库(如果该库已存在)。

正如其他人所提到的,在您的情况下,JUnit库将被视为自动模块。

Modulepath node

答案 2 :(得分:0)

  

如何告诉文件junit没有定义任何模块,它应该以兼容模式运行?

由于中生成的模块junit将是从其工件转换而来的 automatic module 。您需要确保Junit junit:junit:4.12的jar在项目的模块路径上可用,模块将自行解析。

为了确保上述内容,您可以检查IDE中配置的项目/模块的依赖关系,以包含junit:4.12:jar