提问者:小点点

使用Gradle和Spring Boot从Java引用Groovy会导致"找不到符号"


我有一个用Groovy编写的Spring组件DummyStorageRepostory和接口StorageRepostory

class DummyStorageRepository implements StorageRepository {...
}

现在在我的Application.java,这也是一个Spring启动配置,我有

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements AsyncConfigurer { 
...
@Bean
public StorageRepository storageRepository() {
    return new DummyStorageRepository();
}

我的Gradle.buid文件很普通。

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()            
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.1.8.RELEASE'
        classpath 'org.springframework:springloaded:1.2.1.RELEASE'
    }
}

apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'project-report'
apply plugin: 'eclipse'
apply plugin: 'idea'

targetCompatibility = 1.8
sourceCompatibility = 1.8

jar {
    baseName = 'service'
    version =  '0.0.1'
}
repositories {
    mavenLocal()
    mavenCentral()        
}
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.7:indy'
    compile 'org.springframework.boot:spring-boot-starter-actuator:1.1.8.RELEASE'
    compile('org.springframework.boot:spring-boot-starter-web:1.1.8.RELEASE')
}

我的文件结构是

src/main/groovy/com/app/repository/DummyStorageRepository.groovy, StorageRepository.groovy
src/main/java/com/app/Application.java
src/main/resources/...

这是错误

/app/Application.java:103: error: cannot find symbol
    public StorageRepository storageRepository() {
           ^
  symbol:   class StorageRepository
  location: class Application

如果我将Application.java转换为Application.groovy并将其移动到groovy树中,一切都会按预期编译。如果我将DummyStorageRepository.groovy和StorageRepository.groovy转换为java并将其移动到java树中,情况也是如此。

为什么从java引用groovy时会出现“找不到符号”错误?

更新:

我手动将一个源集添加到我的gradle.build中,只是为了查看扫描了哪些路径,但结果保持不变。

sourceSets {

    main {
        groovy {
            srcDirs = ['src/main/groovy']
        }
        java {
            srcDirs = ['src/main/java']
        }
    }

    test {
        groovy {
            srcDirs = ['src/test/groovy','src/test/java']
        }
        java {
            srcDirs = ['src/test/java']
        }
    }
}

共2个答案

匿名用户

所以这个答案的功劳真的应该归于@tim_yates,但问题评论中给出的建议解决方案和理由都是合法的:

把你所有的。< code>src/main/groovy下的java文件,并用groovy编译器编译所有文件

为了引用java文件中的groovy代码和groovy文件中的java代码,在< code>compileGroovy中不能有对< code>compileJava的任务依赖,反之亦然,所以使用< code>compileGroovy的联合编译必须两者都做。

Gradle 用户指南 - 时髦插件

Gradle compileGroovy dependency graph

匿名用户

如果您使用的是< code>Spring Tool Suite (STS),那么使用

右键单击项目 -

Project还将修复该问题,因为现在该项目使用了< code > compile Java compileGroovy ,如上面接受的答案中所述。