7

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

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

   requires junit;
}

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

4

3 回答 3

8

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

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

  • 您无法module-info.java判断 JUnit 是否定义了模块。如果一个模块说它需要另一个模块,那么编译器期望该模块存在 - 没有办法解决这个问题。
  • JUnit 4 是否以模块的形式出现并不太重要——只要将它放在模块路径上,它最终就会被视为一个模块(可能是一个自动模块)。
  • 没有“兼容模式”。您可以继续编写代码,就像在模块系统之前所做的那样(几乎),但是一旦您创建了模块声明,您就需要遵守它的规则。

我建议彻底阅读《模块系统的杰出状态》,然后问问自己到底要完成什么。你真的想创建一个依赖于 JUnit 的模块吗?或者这只是偶然的,因为您使用它的 API 进行测试。如果是后者,你不应该依赖它——相反,你的 IDE / 构建工具需要弄清楚如何编译和运行你的测试。

“依赖于 JUnit 的模块”的扩展

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

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

于 2017-09-28T08:31:36.920 回答
4

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

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

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

模块路径节点

于 2017-10-03T08:32:25.630 回答
0

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

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

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

于 2017-09-28T04:06:13.110 回答