Vad*_*imo 5 java groovy gradle spring-boot
我有一个用 Groovy 编写的 Spring 组件DummyStorageRepository和接口StorageRepository
class DummyStorageRepository implements StorageRepository {...
}
Run Code Online (Sandbox Code Playgroud)
现在在我的 Application.java 中,这也是我拥有的 Spring Boot 启动器配置
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements AsyncConfigurer {
...
@Bean
public StorageRepository storageRepository() {
return new DummyStorageRepository();
}
Run Code Online (Sandbox Code Playgroud)
我的 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')
}
Run Code Online (Sandbox Code Playgroud)
我的文件结构是
src/main/groovy/com/app/repository/DummyStorageRepository.groovy, StorageRepository.groovy
src/main/java/com/app/Application.java
src/main/resources/...
Run Code Online (Sandbox Code Playgroud)
这是错误
/app/Application.java:103: error: cannot find symbol
public StorageRepository storageRepository() {
^
symbol: class StorageRepository
location: class Application
Run Code Online (Sandbox Code Playgroud)
如果我将 Application.java 转换为 Application.groovy 并将其移动到 groovy 树,那么一切都会按预期编译。如果我将 DummyStorageRepository.groovy 和 StorageRepository.groovy 转换为 java 并将其移动到 java 树中,则同样适用。如果有任何问题,我在 gradle 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']
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以这个答案的功劳应该归功于@tim_yates,但问题评论中给出的建议解决方案和原因都是合法的:
将所有 .java 文件移动到下面src/main/groovy并使用 groovy 编译器编译所有文件
为了引用 java 文件中的 groovy 代码和 groovy 文件中的 java 代码,您不能对compileJavain有任务依赖compileGroovy,反之亦然,因此联合编译 usingcompileGroovy必须同时进行。