16

我目前正在测试使用 jdk-9+149 将 Java 8 应用程序迁移到 Java 9 / Jigsaw。

该项目已按标准 Maven 目录布局进行布局,即有src/main/java,src/test/java等。

一旦我添加module-info.javasrc/main/java,maven-compiler-plugin 就会失败并抛出 NullPointerException。这是因为它也希望找到test目录的模块信息。所以,据我所知,选项是:

  • 将测试类保存在单独的模块中,这意味着它们只能访问主模块的导出包。
  • 将测试类连同源一起移动到主模块中,这意味着主模块需要测试依赖项。

显然,这些选项似乎都不是可取的,所以我认为有一种推荐的方法可以在 Maven 项目中测试 Jigsaw 模块。不幸的是,我既找不到建议也找不到例子。

编辑:添加一些我在发布问题时不认为相关的信息(对不起)

4

3 回答 3

10

Maven 对 Java 9 的总体支持,特别是对测试的支持仍在开发中 - 很多东西可以工作,但其他的可能不行。在没有看到 NPE 的堆栈跟踪的情况下,这当然是推测,但我假设您遇到了这个错误

更一般地说,单元测试如何与 Jigsaw 一起工作的问题仍在讨论中——甚至在 Jigsaw 邮件列表中也是如此。

以下是我对此事的看法:

  1. 正如您所注意到的,将测试放入单独的模块意味着只有导出包中的公共类型是可测试的,这绝对是不够的。可能有一些变通方法,但需要动态编辑模块声明(源代码;module-info.java)或描述符(字节码, ),或者在编译和运行测试的命令module-info.class中添加大量--add-exports命令行标志。这些听起来都不是特别有趣,尤其是如果您想手动完成。javacjava

  2. 出于显而易见的原因,将测试移到源代码树中也是一个坏主意,尤其是其中创建一个没有测试的 JAR 需要大量的摆弄。

  3. 另一个选项是使用--patch-module允许将class-files 或 JAR 的内容添加到现有模块的选项。这样,该testCompile步骤可以创建一个包含源文件测试文件的 JAR。java --add-reads不幸的是,除非它像上面描述的那样操作模块声明/描述,否则如果不为测试依赖项添加读取边,则无法执行生成的 JAR 。不过还是比上面的好。

  4. 作为一种最后的手段,有一些方法可以将生产 JAR 视为常规 JAR 而不是模块。最简单的可能是将它与测试 JAR 一起转储到类路径中。这样,一切都像在 Java <9 中一样工作。不幸的是,这将破坏使用功能的代码,假设它位于命名模块内(例如,与反射 API 的某些类型的交互)。

就个人而言,我认为 3. 是上述选项中最好的。它不需要改变项目布局,只需要相对较小的添加javacjava命令。

于 2016-12-28T18:33:47.490 回答
6

您至少必须使用 maven-compiler-plugin 3.6.0 才能获得拼图支持。但是,由于 build +148 类文件的二进制结构发生了变化,因此插件无法像以前一样提取模块名(模块名是编译测试所必需的)。我正在努力解决这个问题,但我可能依赖于新版本的 ASM。

更新:maven-compiler-plugin-3.6.1 已发布,因此恢复了对拼图的支持。

于 2016-12-28T22:43:03.980 回答
1

正如这里已经建议的那样,使用 maven-compiler-plugin:3.7.0 的更新版本将帮助您解决这个问题:-

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
            <source>9</source>
            <target>9</target>
            <compilerArgument>-Xlint:all</compilerArgument>
        </configuration>
     </plugin>
</plugins>

您可以将单元测试放在与模块化之前相同的目录下。这是我的一个示例项目,它基于 JDK9 和 Maven3+。该项目遵循屏幕截图中描述的目录结构:-

在此处输入图像描述

并发布此内容,您需要做的就是使用以下命令执行测试:

mvn test

从项目的根目录中查找测试将照常执行。

于 2017-10-12T04:39:32.487 回答