Java 9模块和JUnit 4

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没有定义任何模块,它应该在兼容模式下运行?

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

你的问题似乎是基于几个误解:

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

我建议对模块系统的优秀状态进行全面阅读,然后问问自己究竟要完成什么。 你真的想创建一个依赖于JUnit的模块吗? 或者这只是偶然的,因为您使用其API进行测试。 如果是后者,则不应该依赖它 – 而是您的IDE /构建工具需要弄清楚如何编译和运行测试。

扩展“依赖于JUnit的模块”

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

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

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

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

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

Modulepath节点

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

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

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