如何在Spring Boot项目中同时使用Java与Groovy?
你完全可以在Spring Boot项目中同时使用Java和Groovy,实现像Grails那样的无缝兼容,只需要调整项目的构建配置和目录结构即可。以下是针对Maven和Gradle两种主流构建工具的具体步骤:
一、基础项目准备
不管你用Spring Initializr初始选择的是Java还是Groovy项目,后续都可以添加对另一种语言的支持。建议先选择Java作为初始语言,后续添加Groovy支持,操作更直观。
二、Maven项目配置
1. 添加Groovy依赖
在pom.xml的<dependencies>块中添加Groovy核心依赖:
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> </dependency>
Spring Boot的父依赖已经管理了Groovy的版本,无需手动指定版本号。
2. 配置多语言编译插件
修改<build>块中的编译插件,使用Groovy Eclipse编译器同时处理Java和Groovy文件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <compilerId>groovy-eclipse-compiler</compilerId> <source>17</source> <!-- 替换为你的JDK版本 --> <target>17</target> </configuration> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-eclipse-compiler</artifactId> <version>3.9.0-01</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-eclipse-batch</artifactId> <version>3.0.17-01</version> </dependency> </dependencies> </plugin> </plugins> </build>
该配置会让Groovy编译器处理src/main/java和src/main/groovy下的所有源码,利用Groovy作为Java超集的特性,实现两种语言代码的互相调用。
三、Gradle项目配置
Gradle对多语言编译的支持更原生,步骤更简单:
1. 确保Groovy插件已启用
在build.gradle的plugins块中同时添加java和groovy插件:
plugins { id 'java' id 'groovy' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' }
2. 添加Groovy依赖
在dependencies块中添加Groovy核心依赖:
dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.codehaus.groovy:groovy' // 测试依赖可选 testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.codehaus.groovy:groovy-test' }
Gradle会自动识别src/main/groovy和src/main/java目录,无需额外配置编译规则,Groovy编译器会自动处理两种语言的文件。
四、项目目录结构
创建对应的源码目录,确保Java和Groovy代码处于同一包路径下,方便互相访问:
src/ ├── main/ │ ├── java/ │ │ └── com/example/demo/ │ │ └── JavaService.java │ └── groovy/ │ └── com/example/demo/ │ └── GroovyService.groovy └── test/ ├── java/ └── groovy/
五、代码示例(无缝调用)
Java类示例
package com.example.demo; import org.springframework.stereotype.Service; @Service public class JavaService { public String getJavaMessage() { return "Hello from Java!"; } }
Groovy类示例(调用Java类)
package com.example.demo import org.springframework.stereotype.Service @Service class GroovyService { private final JavaService javaService // Groovy自动生成构造函数,支持Spring依赖注入 GroovyService(JavaService javaService) { this.javaService = javaService } String getCombinedMessage() { "${javaService.getJavaMessage()} + Hello from Groovy!" } }
测试调用
在Spring Boot主类中添加测试逻辑:
package com.example.demo; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean CommandLineRunner run(GroovyService groovyService) { return args -> System.out.println(groovyService.getCombinedMessage()); } }
运行项目后,控制台会输出:Hello from Java! + Hello from Groovy!,证明两种语言代码已实现无缝兼容调用。
注意事项
- 确保JDK版本与Groovy版本兼容:比如Spring Boot 3.x要求JDK 17+,需搭配Groovy 4.x版本;
- 两种语言的代码遵循各自的语法规范即可,Groovy会自动兼容Java语法,Java也能直接调用Groovy类(Groovy类默认是public的)。
内容的提问来源于stack exchange,提问作者John Little

