Gradle 编译生成 java 文件

Gradle compile generated java file

我正在尝试将一个大项目从使用 makefiles.

的当前状态转换为使用 gradle

虽然在某些时候我遇到了困难。假设我们有以下目录树(为简单起见省略了很多东西):

root
|-- src
|    +-- main
|         +-- java
|              +-- com
|                  +-- app
|                      |-- a
|                      |-- b
|                      +-- c
+-- build.gradle

现在假设在包 com.app.c 中存在一个 java 文件,其主文件 class 用于在同一目录下生成新的 java 文件然后也应该编译它。包 com.app.c 也依赖于其他包。

使用 makefile,您可以执行如下操作(一个简单的算法):

  1. 编译包 `com.app.a` 和 `com.app.c`。
  2. 移动到包目录 `com.app.b` 并只编译创建生成文件所需的文件。
  3. 通过运行在用于生成的文件中使用主函数来创建生成的文件。
  4. 编译整个 `com.app.b` 包,其中现在包含生成的文件。

使用 gradle 虽然我做不到那样的事情(或者至少我认为我做不到)。

我想做的是创建一个 JavaExec 任务,该任务将 运行 生成生成的 java 文件的文件,并在 compileJava 之后使其成为 运行 并使用 compileJava 完成。但显然这是任务之间的循环依赖和死胡同。

有没有人做过或遇到过类似的事情?如果有人能提供帮助,我将不胜感激。

请注意,我不能轻易地将文件生成移出该文件,因为它有一些深度依赖关系...

看来我没搜到那么好

使用 this 解决方案也适用于这种情况。

不同的是你必须有以下配置:

task generateFile(type: JavaExec) { ... }

task compileGeneratedFile(type: JavaCompile) { ... }

generateFile.mustRunAfter compileJava
generateFile.finalizedBy compileGeneratedFile
generateFile.onlyIf { !file("path/to/file").exists() }

这似乎可以解决问题!只是发布答案,这样任何有相同问题的人都会发现它更容易。