【发布时间】:2017-06-02 05:15:27
【问题描述】:
IntelliJ (v2016.3) 中 JUnit 测试的默认配置是在启动前运行 Build。通常,这是一件好事,因为它可以确保在运行测试之前已经应用了所有更改。但是,它似乎是删除生成代码的编译类。正如您所料,这意味着测试失败是因为生成的类的测试无法再找到它们要测试的类!
如何保持 IntelliJ 的默认“启动前构建”行为,而不会在运行测试时让我编译生成的类被吹走?
现在了解一些细节。
我使用的是Immutables 库(不是 Lombok),所以它是使用“普通”Java 注释机制生成的代码。 IntelliJ 很高兴地接受更改并通过注释生成 Java 代码。它还将在更新生成的 Java 文件发生更改时对其进行编译。因此,一般的“自动构建”行为似乎正在起作用。对我来说,这似乎表明我正确设置了注释处理器。
但是,当我手动运行“构建模块”或在测试之前运行“构建”时,生成的 Java 文件的类文件将被删除。生成的 Java 文件不会以任何方式更改,但会删除它们编译成的类文件。对我来说,这意味着 Build 中有些东西没有关注 Generated Source 依赖项。
我注意到的一件事是,如果我不将生成源的目录标记为 Generated Source Root,则这种“删除生成的源文件的类文件”行为不会不会发生。这样做的缺点是 IntelliJ 不再识别生成的类,并在使用它们的代码中将它们标记为未知。
我如何配置 IntelliJ:
-
Preferences -> Annotation Processors正在使用Module content root、Obtain processors from project classpath,并指定了生产和测试源目录字段(并且在生成源文件时似乎尊重这些字段) -
Preferences -> Compiler不是使用Clear output directory on rebuild,是使用Build project automatically -
File -> Other Settings -> Annotation Processors与以上两点配置相同 - 正在生成源的目录被标记为 Generated Source 目录
我一直在反对这个问题太久了,尝试了我能想到的一切以及任何人甚至暗示的一切,但无济于事。任何有关如何完成这项工作的帮助(“从测试配置中删除构建选项”除外)都将非常有帮助并深表感谢。
【问题讨论】:
标签: java intellij-idea annotations code-generation immutables-library