【问题标题】:How to use gradle. Java, and Groovy together?如何使用梯度。 Java 和 Groovy 在一起?
【发布时间】:2014-04-17 14:54:36
【问题描述】:

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

  • Java 文件看不到 Groovy 文件
  • IntelliJ 似乎忘记了 Groovy,并提示我为其配置 GDK

我读到 groovy 插件允许 Groovy 和 Java 在混合自己的源路径中,但 Java 想要它自己的。所以我有以下目录结构:

  • src\main\groovy
  • src\main\java
  • src\test\groovy

我混合了 Java 和 Groovy 类

这是我的 build.gradle:

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'
}

这是我在运行“gradle clean build”时遇到的构建错误:

...src/main/java/com/product/service/FileDownloadService.java:24:  cannot find symbol 
symbol  : class FileDownload 
location: class com.product.service.FileDownloadService

private FileDownload fileDownload;

如果我将所有内容都制作成 Java,那么我不会遇到任何编译或执行错误。

【问题讨论】:

  • 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 插件应用。)

标签: java groovy gradle spring-boot


【解决方案1】:

尝试将下一行附加到文件“build.gradle”

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

对不起,我的英语不好。我希望这可以帮助您解决问题。

【讨论】:

  • 将 'src' 添加为 srcDir 意味着您将 groovy 和 java 都放入 "$projectDir/src"。另一个答案中的显式“set srcDirs”方法比这个更可取。
【解决方案2】:

如上所述,使用 groovy 插件编译也会编译 java 类。 我们只需要确保 java compile 任务不会在源代码以及 groovy 任务上触发...

为此,并保留源文件夹(例如:在eclipse中),您可以在build.gradle中使用以下精炼的sn-p:

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
  }
}

如果您只指定groovy { srcDir "src" },您的main/groovymain/java 文件夹在eclipse 中被识别为包...

【讨论】:

  • 不幸的是,这行得通……我为什么这么说?我的 gradle 项目(最初)有 main/java 和 main/groovy,还有一个 Groovy main() 程序。一切都非常顺利。不需要sourceSets hack —— 所以我需要这样做只是因为我将我的主要内容更改为 Java 导入 Groovy 类,这让我很困扰。它不是对称的。我希望有更好的方法。 . .
  • 进一步观察,现在我的 Netbeans IDE 显示“Groovy in groovy”和“Groovy in java”——虽然这可行,但我寻求更好的答案。这种方法是在 Java 目录中提取 Groovy 文件——我可以说,不小心编译了它在此过程中找到的 Java 文件。如果我听起来像个奶奶,我很抱歉;有时仅仅因为它有效,并不意味着它是一个合理的方法
  • 是的,我也不喜欢那样...但与此同时,它可以工作,我必须继续编码...我会在下次培训时询问我是否获得机会。
  • 这可行,但我同意并不理想(类似于stackoverflow.com/a/37609252/5158636,但这种方式是程序化的)。如果没有这个修复,我会困惑地在 build/libs 中看到一个包含 Java 和 Groovy 类的瘦 .jar,但在 build/distributions 中生成的胖 .jar 最终只包含 Groovy 类。
【解决方案3】:

我的解决方案是将 Java 和 Groovy 类都放在 src/main/groovysrc/test/groovy 中(用于测试类)。从编译器的角度来看,这将导致与其他答案中建议的对 sourceSets 的更改非常相似。

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

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

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2020-01-12
    • 2023-04-10
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2011-01-21
    相关资源
    最近更新 更多