Gradle Groovy插件似乎删除了编译的Java类

时间:2014-08-21 20:10:05

标签: java groovy gradle

在尝试编译使用groovy作为脚本语言的项目时,我得到了一个非常奇怪的效果。设置非常简单:

我有一个可以通过groovy脚本配置的java应用程序。解析配置文件全部由groovy代码处理,并生成几个类,这些类包含从脚本中提取的信息,而不是java应用程序可用的信息。

配置类都实现接口,以解耦groovy方面,以便java应用程序不知道它实际上与groovy对象进行对话。

所以,对于接口,我在这里唯一的依赖是从groovy到java。这应该是正常情况,因为groovy插件默认在compileJava之前执行compileGroovy

这直到今天工作!!!

几个小时前,事情开始变得奇怪。尝试用gradle test测试我的应用程序导致错误告诉我groovy类没有看到java接口。我试过用compileJava后跟compileGroovy分别编译java和groovy,并注意到后者只是删除了java任务生成的所有类文件。使用--info选项运行时,我也发现了一个奇怪的输出:

Output file /home/tomas/projects/unnecessary-wizard/build/classes/main has changed.
Output file /home/tomas/projects/unnecessary-wizard/build/classes/main/de/tlongo/unneccesarywizard/java/core/Wizard.class has changed.
Output file /home/tomas/projects/unnecessary-wizard/build/classes/main/de/tlongo/unneccesarywizard/java/core/ConstructorInjector.class has changed.

为什么groovy任务会改变java类?

正如我所说,我尝试用一​​个简单的展示来重现错误,其中一个groovy类也实现了一个java接口,没有成功。

这是我的build.script,其中9到5,imo:

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

group = 'de.tlongo'
version = '0.3-SNAPSHOT'

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.5'
    compile 'commons-configuration:commons-configuration:1.7'
    compile 'ch.qos.logback:logback-classic:1.1.1'
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'org.reflections:reflections:0.9.9-RC1'

    testCompile 'org.hamcrest:hamcrest-all:1.3'
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile 'org.mockito:mockito-all:1.9.5'
}

知道出了什么问题吗?或者我不理解gradle如何编译这类项目的概念。

2 个答案:

答案 0 :(得分:1)

在Gradle中编译Java和Groovy源代码时,通常应该将所有源代码放在' src / main / groovy'允许交叉编译的目录。它们可以是分开的(java中的java,groovy中的groovy);但是,如果存在跨语言依赖关系,则可能会遇到编译问题 - 这就是您遇到的问题。

另外,作为附注,当您应用groovy插件时,您不需要应用java插件 - groovy插件依赖于java插件,因此它已经可用。

答案 1 :(得分:0)

只有在将Groovy类移植到Java之后才会发生这种情况。这是一个已知的限制,因为GroovyCompileJavaCompile都删除了它们在上一次运行时生成的类文件,以防止过时的类文件。