当前位置: 首页 > 知识库问答 >
问题:

Gradle-Groovy和Java类依赖项-Compile

谢泉
2023-03-14

我的项目既有Java(N个文件)又有Groovy代码(只有1个文件)。Java compile依赖于这个单个Groovy文件的类文件进行Java编译(compileJava任务成功)。

当我不使用src/java作为main>groovy>sourceSet部分中的一个srcDir时,我会得到一个错误,说明在groovy文件/class中找不到class/symbol。在ANT中,我们很容易首先调用compile-groovy目标,然后再调用compile-java目标,但在Gradle中也是这样。

我读了一些帖子,发现如果我将main>java部分设为空,并为main>java指定srcDir,这是main>groovy sourceSet部分中的src/java,那么它的编译就很好。

我的?S:1。还有别的办法吗?对于ex,以下操作应起作用:

   compileJava {
     dependsOn compileGroovy
   }

不过,这是一个无限循环。

对于compileJava任务使用doFirst怎么样:

compileJava {
      doFirst {
            compileGroovy
      }
}

这也不管用。







apply plugin: 'java'
apply plugin: 'groovy'

sourceSets {
   main {
      groovy {
         srcDir 'src/groovy'
         srcDir 'src/java'
      }
      java {
       //The following needs to be commented out OR Gradle will always pick compileJava before compileGroovy
       //srcDir 'src/java'
       //srcDir 'src/java-test'
      }
   }
   test {
      groovy {
         srcDir 'test/groovy'
      }
      java {
         srcDir 'test/java'
      }
      resources {
         srcDir 'test/resources'
         srcDir 'conf'
      }
   }
   integrationTest {
      groovy {
         srcDir 'src/groovy-test'
      }
      java {
         srcDir 'src/java-test'
      }
      resources {
         srcDir 'test/resources'
         srcDir 'conf'
      }
   }
}

其他链接:如何让Gradle在Java测试之前编译Groovy测试

共有1个答案

云承天
2023-03-14

Groovy(base)插件使groovycompile任务依赖于相应的javacompile任务,因为从Groovy调用Java比反过来调用更常见。如果您需要它的另一种方式(或两种方式),联合编译是一个很好的解决方案。以下是一个稍微改进的(相对于您的版本)联合编译设置:

sourceSets {
    main {
        groovy {
            // override the default locations, rather than adding additional ones
            srcDirs = ['src/groovy', 'src/java'] 
        }
        java {
            srcDirs = [] // don't compile Java code twice 
        }
    }
}

如果您喜欢只使用Java->Groovy依赖项进行单独编译,那么应该可以使用以下方法

// since you aren't using the default locations
sourceSets {
    main {
        groovy {
            srcDirs = ['src/groovy']
        }
        java {
            srcDirs = ['src/java']
        }
    }
}

// remove GroovyCompile->JavaCompile task dependencies
tasks.withType(GroovyCompile) {
    dependsOn = [] 
}

// add JavaCompile->GroovyCompile task dependencies
tasks.withType(JavaCompile) { task ->  
    dependsOn task.name.replace("Java", "Groovy")
}

因为javacompile任务及其对应的groovycompile任务写入同一个输出目录,所以Java编译现在将在其compile类路径上拥有已编译的Groovy代码。

PS:不支持从另一个任务调用一个任务,如果你尝试的话可能会发生不好的事情。相反,您应该始终使用任务关系(dependsonfinalizedbymustrunaftershouldrunafter)。

 类似资料:
  • 我正在使用mongodb和Spring Boot。最近,我的mongodb升级到了3.0版本。 我对Spring使用以下Gradle依赖项: 如果我查看maven存储库中的gradle:,我会看到以下内容(http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb/1.2.6

  • 问题内容: 假设我想在项目中添加guice-assistedinject作为依赖项。它将guice工件指定为依赖项本身。如何告诉它使用guice的no_aop版本? 我知道我可以执行以下操作,但是我可以一步完成而不排除guice模块吗? 问题答案: 没有更简单的解决方案。您可以使用简短的依赖性表示法(例如)来缩短代码。

  • 本文向大家介绍gradle 依赖于另一个Gradle项目,包括了gradle 依赖于另一个Gradle项目的使用技巧和注意事项,需要的朋友参考一下 示例 对于多项目gradle构建,有时可能需要依赖构建中的另一个项目。为此,请在项目的依赖项中输入以下内容: ':OtherProject'从目录结构的根引用的项目gradle路径在哪里。 为了':OtherProject'在build.gradle文

  • 我正在学习创建java ee web应用程序。在intellij idea中,我使用项目向导创建了一个项目:Java Enterprise->Web Application。然后,我在项目根中创建了一个构建文件.gradle,并在终端中调用、。这是构建文件。Gradle 当我添加依赖项并进行渐进式构建时,它们不会加载到项目中。例如,Gson库在代码中不可用。如何告诉Gradle下载这些库以便我可以

  • 到 。 让我惊讶的是,通过创建的fat jar不再包含下所需的lib了吗?如果我将“实现”替换为“编译”,它就会像预期的那样工作。 有什么东西需要配置以便spring-boot-plugin添加它们吗?还是需要提前将项目升级到spring Boot2?