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

Posted

技术标签:

【中文标题】如何使用梯度。 Java 和 Groovy 在一起?【英文标题】:How to use gradle. Java, and Groovy together? 【发布时间】: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 插件应用。) 【参考方案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 文件。如果我听起来像个奶奶,我很抱歉;有时仅仅因为它有效,并不意味着它是一个合理的方法 是的,我也不喜欢那样...但与此同时,它可以工作,我必须继续编码...我会在下次培训时询问我是否获得机会。 这可行,但我同意并不理想(类似于***.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 的构建脚本中进行任何配置。所以它有助于保持简单。

【讨论】:

以上是关于如何使用梯度。 Java 和 Groovy 在一起?的主要内容,如果未能解决你的问题,请参考以下文章

groovy 在eclipse中如何实现语法提示

当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?

Java调用groovy及groovy中如何使用springBean

如何在 Groovy 类中“隐藏”元类属性

如何在 Groovy 中动态覆盖类的“each”方法?

如何使用 Java 调用 Groovy 或 Scala UDF 来更新 Oracle?