【问题标题】:Java 9 Modules and JUnit 4Java 9 模块和 JUnit 4
【发布时间】:2018-03-09 11:17:00
【问题描述】:

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

【问题讨论】:

  • 您在项目中使用什么框架? maven / gradle 等等?还有哪个版本的Eclipse 氧气

标签: java eclipse junit4 java-9 java-platform-module-system


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 对不起,尼古拉,你的假设都不正确。看我的问题。我们有一个小项目“topsort”。 10 年前用 Java 5 或 6 构建。现在我们有了 Java 9。我们编译并运行 JUnit 测试以达到绿色。美好的!现在我们更进一步。我们使用eclipse来生成module-info.java文件。这将允许我们将 topsort 算法定义为一个模块以供将来使用。所以eclipse生成了定义模块“topsort”的文件,并定义了JUnit对测试的依赖。但是 JUnit 似乎不在模块路径上。为什么,以及如何纠正是个问题。
  • 如果您能指出我的哪些“假设”是不正确的,这将有所帮助 - 所有三个要点都是坚如磐石的,其余的主要是问题。您编写“因此 eclipse 生成定义模块'topsort'的文件并定义 JUnit 的依赖项以进行测试”-除非 topsort 是一个测试库,否则您不希望该依赖项存在。我编辑了答案以提供解释。
  • 我说的是你的假设 w.r.t.我的问题。你提到pom。这不是一个 Maven 项目。存在一个 ant 脚本来测试和构建 jar。我再说一遍,问题是如何告诉 eclipse 将 JUnit 库放在模块路径上。我刚刚阅读了一些关于在构建路径中切换条目模块:否以读取模块:是的内容。我在 junit.jat 和 org.hamcrest.core_1.3.0v 的用户库定义中尝试过...我找到了这样的条目,但没有任何东西可以切换。我使用氧气补丁:1.1.1.v20170826-0521_BETA_JAVA9 和 1.1.1.v20170826-0521_BETA_JAVA9。
  • 我不认为你有一个 Maven 项目,我用它作为一个例子来说明为什么要求 junit 肯定是错误的(我们甚至没有谈论没有库应该被发布,通过从其文件名派生的名称引用模块)。我确实假设“topsort”(您可以链接到该项目吗?)不是与测试相关的库。如果这是正确的,那么答案就是正确的。
  • 简答:从 module-info.java 中删除 requires junit;。更长的答案:您的测试代码不属于生成的运行时 jar。因此,您的运行时 jar 又不依赖于 junit。真正的答案:试着理解尼古拉所说的话,他是绝对正确的,并且知道他在说什么。
【解决方案2】:

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

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

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

【讨论】:

  • 请放心,我有适用于 Java 9 的最新可用 BETA 插件。我从 eclipse 中检测到了 froject,然后我删除了所有 .x 文件,如 .classpath、.project 和文件夹 .settings高清。然后我在eclipse中重新打开了这个项目。 eclipse 现在可以看到结果 junit!
  • 我还修改了 eclipse.ini 文件以从 Java 9 开始。到目前为止这工作。我还从 Eclipse 开始了 JUnit 测试。发生了一些事情,但没有显示结果,也没有错误。我尝试使用 JUnit 5 而不是 4,但这似乎需要更多的适应。 W.r.t. Ant,ant仍然无法编译module-info.java。事实上,ant 仍然使用 Java 8 编译器。虽然我试图告诉 ant 使用 java 9,但到目前为止我还没有成功。结论,Java 9,模块,+ JUnit + ant,似乎仍然是一个挑战。我不确定所有这些问题能否在 10 月 11 日之前得到解决。
  • 您的图片显示了 Junit 下的子项“模块化”。尽管我无法获得任何更新的 BETA 插件,但我的 IDE 中缺少此功能。我安装了 1.1.1.v20170826-0521_BETA_JAVA9。在 10.11 之后,我将下载 4.7.1(a),看看有什么变化。在那之前,我会让其他石头滚起来!
  • @juerg "v20170826" 表示您从 2017 年 8 月 26 日起进行了更改。我不确定为什么您无法从 2017 年 10 月获得更新的更新。您可能应该从全新的 Eclipse 安装开始并按照 Eclipse 市场条目中的步骤进行操作,或者立即下载 4.7.1a RC2 构建。如果您仍然看到任何问题,那么我建议您打开bug report for Eclipse
  • 感谢您的确认。我同意。是的,我尝试了几次更新。没用。我看到下载4.7.1a RC2,但是我没有下载。我正在等待 10.11,因为我还有用于 JNI 开发的 C++ 插件。这意味着一些额外的工作,因此没有时间做两次。无论如何,目的是对 Java 9 和模块有一些经验。我将在下周回来,如果我发现我从 2007 年开始就已经模块化的小型项目有问题,我会报告。
【解决方案3】:

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

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

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

【讨论】:

  • JUnit 在 IDE 的类路径中,否则测试不会是绿色的!但显然它不在 w.r.t 的类路径上。模块定义。因此,问题是如何检查它,以及在哪里可以配置它。当然,我可以等到 10 月 11 日和 Oxygen 的 SP1 的结果,希望那时这个错误就消失了。不过我很想知道它是否可以在之前修复。
  • 它必须在模块路径上才能成为自动模块。
  • @Nicolai 是的,已更正。 from classpath 无论如何都是一个未命名的模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2018-06-23
  • 1970-01-01
相关资源
最近更新 更多