如何使用梯度。 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/groovy
和main/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/groovy 和 src/test/groovy 中(用于测试类)。从编译器的角度来看,这将导致与其他答案中建议的对 sourceSets 的更改非常相似。
从用户的角度来看,我认为将源文件保存在单独的文件夹层次结构中并没有真正的好处,因为它使查找变得更加困难。此外,您可能会在 Java 和 Groovy 之间迁移您的类以选择最佳实现。
主要好处是它可以开箱即用,无需在 Gradle 的构建脚本中进行任何配置。所以它有助于保持简单。
【讨论】:
以上是关于如何使用梯度。 Java 和 Groovy 在一起?的主要内容,如果未能解决你的问题,请参考以下文章
当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?