我有一个用Groovy编写的Spring Component DummyStorageRepository和接口StorageRepository
DummyStorageRepository
StorageRepository
class DummyStorageRepository implements StorageRepository {... }
现在在我的Application.java中,这也是我的Spring Boot启动器配置
@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树中,则同样适用。如果有任何问题,我将在第2.1章中讲解。
从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'] } } }
因此,此答案应归功于@tim_yates,但问题注释中给出的建议解决方案和原因都是合法的:
将所有.java文件移动src/main/groovy到groovy编译器下并编译所有文件
src/main/groovy
为了引用Java文件中的groovy代码和groovy文件中的Java代码,您不能对compileJavain 拥有任务依赖性compileGroovy,反之亦然,因此使用联合编译compileGroovy必须同时执行这两项。
compileJava
compileGroovy
Gradle用户指南- Groovy插件
Gradle compileGroovy依赖图