如何使用gradle。Java和Groovy在一起?

如何使用gradle。Java和Groovy在一起?,java,groovy,gradle,spring-boot,Java,Groovy,Gradle,Spring Boot,我试图在IntelliJ 13中使用Gradle项目,但我一直遇到以下问题: Java文件看不到Groovy文件 IntelliJ似乎忘记了Groovy,并提示我为它配置GDK 我读到groovy插件允许groovy和Java混合使用自己的源代码路径,但Java需要自己的源代码路径。因此,我有以下目录结构: src\main\groovy src\main\java src\test\groovy 我混合了Java和Groovy类 这是我的身材。格雷德尔: apply plugin: 'java

我试图在IntelliJ 13中使用Gradle项目,但我一直遇到以下问题:

Java文件看不到Groovy文件 IntelliJ似乎忘记了Groovy,并提示我为它配置GDK 我读到groovy插件允许groovy和Java混合使用自己的源代码路径,但Java需要自己的源代码路径。因此,我有以下目录结构:

src\main\groovy src\main\java src\test\groovy 我混合了Java和Groovy类

这是我的身材。格雷德尔:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'war'


buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4")
    }
}

jar {
    baseName = 'my-app'
    version = '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-snapshot" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.0.0.RC4")
    compile("org.springframework:spring-orm:4.0.0.RC1")
    compile("org.hibernate:hibernate-entitymanager:4.2.1.Final")
    compile("com.h2database:h2:1.3.172")
    compile("joda-time:joda-time:2.3")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")
    compile ('org.codehaus.groovy:groovy-all:2.2.1')

    testCompile('org.spockframework:spock-core:0.7-groovy-2.0') {
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    }
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7+')
    testCompile("junit:junit")
}

jacocoTestReport {
  <!-- not sure this is right  -->
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

如果我把所有东西都变成Java,那么我就不会得到任何编译或执行错误

尝试将下一行追加到文件build.gradle

sourceSets {
      main {
        java { srcDirs = [] }    // no source dirs for the java compiler
        groovy { srcDir "src" }  // compile everything in src/ with groovy
       }
    }

请原谅我英语不好。我希望这能对您的解决方案有所帮助。

像上面提到的那样,使用groovy插件编译也会编译java类。 我们只需要确保java编译任务不会像groovy任务一样在源代码上启动

为此,您可以在build.gradle中使用以下精练的代码段,并保留源文件夹,例如:在eclipse中:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'war'


buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4")
    }
}

jar {
    baseName = 'my-app'
    version = '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-snapshot" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.0.0.RC4")
    compile("org.springframework:spring-orm:4.0.0.RC1")
    compile("org.hibernate:hibernate-entitymanager:4.2.1.Final")
    compile("com.h2database:h2:1.3.172")
    compile("joda-time:joda-time:2.3")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")
    compile ('org.codehaus.groovy:groovy-all:2.2.1')

    testCompile('org.spockframework:spock-core:0.7-groovy-2.0') {
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    }
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7+')
    testCompile("junit:junit")
}

jacocoTestReport {
  <!-- not sure this is right  -->
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

如果您只指定groovy{srcDir src},那么您的main/groovy和main/java文件夹将被标识为eclipse中的包…

我的解决方案是让java和groovy类都位于测试类的src/main/groovy和src/test/groovy中。从编译器的角度来看,这将导致与其他答案中建议的源集更改非常相似的结果

从用户的角度来看,我看不到将源文件保存在单独的文件夹层次结构中的真正好处,因为这会使查找更困难。此外,您可能会在Java和Groovy之间迁移类,以选择最佳实现


主要的好处是它可以开箱即用,而不需要在Gradle的构建脚本中进行任何配置。因此,它有助于保持简单

Groovy测试代码的默认位置不是test\main\Groovy,而是src\test\Groovy。您的java代码应该在src\main\java中,这是编译器默认的位置。如果你把它们放在其他地方,它们就不会被编译。另一方面,你为什么要强制使用里程碑/发布版Spring Orm 4.0.0.RC1候选者,而Spring 4.0.2已经发布并被你的启动项目引用。Java代码应该在src\main\groovy中,因为OP需要联合编译。除非重新配置,src\main\Java中的Java代码将看不到Groovy代码。不,这不是问题所在。如果希望Java/Groovy联合编译,则必须将Java源代码传递给Groovy编译器,而不涉及CompileJava任务。Java插件仍然存在,因为Groovy插件构建在它之上。不过,您不必显式地应用Java插件,因为Groovy插件将应用它。。。我为什么这么说?我的gradle项目最初有main/java和main/groovy,还有一个groovy主程序。一切都很顺利。不需要sourceSets hack——因此,我之所以需要这样做,仅仅是因为我将我的main更改为Java导入Groovy类,这让我很困扰。它不是对称的。我希望有更好的方法。进一步观察,现在我的Netbeans IDE在Groovy中使用Groovy,而在java中使用Groovy——在这起作用的同时,我寻求一个更好的答案。这种方法弥补了Java目录中Groovy文件的不足——我可以说,在编译过程中偶然发现了Java文件。如果我听起来像奶奶,我道歉;有时仅仅因为它有效,并不意味着它是一个合理的方法。是的,我也不喜欢那样。。。但同时,它也起作用了,我必须继续编码。。。我会在下一次培训时询问我是否有机会。这是可行的,但我同意这并不理想,类似于,但这种方式是程序化的。如果没有这个修复,我会很困惑地在build/libs中看到一个瘦的.jar,它同时包含Java和Groovy类,但在build/distributions中生成的胖.jar最终只包含Groovy类。将“src”添加为srcDir意味着将Groovy和Java都放在$projectDir/src中。另一个答案中的显式set srcDirs方法比这更可取。
apply plugin: 'groovy'
//...
sourceSets {
  main {
    java { srcDirs = [] }    // no source dirs for the java compiler
    groovy { srcDirs = ["src/main/java", "src/main/groovy"] }  // compile   everything in src/ with groovy
  }
}