在尝试编译使用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如何编译这类项目的概念。
答案 0 :(得分:1)
在Gradle中编译Java和Groovy源代码时,通常应该将所有源代码放在' src / main / groovy'允许交叉编译的目录。它们可以是分开的(java中的java,groovy中的groovy);但是,如果存在跨语言依赖关系,则可能会遇到编译问题 - 这就是您遇到的问题。
另外,作为附注,当您应用groovy插件时,您不需要应用java插件 - groovy插件依赖于java插件,因此它已经可用。
答案 1 :(得分:0)
只有在将Groovy类移植到Java之后才会发生这种情况。这是一个已知的限制,因为GroovyCompile
和JavaCompile
都删除了它们在上一次运行时生成的类文件,以防止过时的类文件。