【问题标题】:Gradle compile generated java fileGradle 编译生成的 java 文件
【发布时间】:2015-05-27 11:39:19
【问题描述】:

我正在尝试将一个大型项目从使用 makefiles 的当前状态转换为使用 gradle

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: java gradle makefile


    【解决方案1】:

    看来我搜索的不是很好。

    在这种情况下也可以使用this 解决方案。

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

    task generateFile(type: JavaExec) { ... }
    
    task compileGeneratedFile(type: JavaCompile) { ... }
    
    generateFile.mustRunAfter compileJava
    generateFile.finalizedBy compileGeneratedFile
    generateFile.onlyIf { !file("path/to/file").exists() }
    

    这似乎可以解决问题!只需发布答案,以便有相同问题的任何人都能更轻松地找到答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多