use*_*270 5 groovy spring gradle
我在混合 Java/Groovy 环境中遇到编译顺序问题。我们使用 Gradle 2.1、JDK 7 和 Groovy 2.3。使用 Gradle 插件和相同的 build.gradle 文件,代码在 STS(Spring Tool Suite)中可以正常编译,但在命令行上运行构建时会失败。STS 配置为使用 Groovy Eclipse 插件,如果我理解正确的话,它使用它自己的编译器。所以我认为这个问题源于我们使用 Gradle 的 Groovy 插件中的 Groovy 编译器时的编译顺序问题。这是 Groovy 类:
@Component
@ToString(includeNames = true, includePackage = false)
class ManagedCloseableHttpClientFactory implements ClientHttpRequestFactory {
@Delegate
HttpComponentsClientHttpRequestFactory factory
...
}
Run Code Online (Sandbox Code Playgroud)
ClientHttpRequestFactory 是一个 Spring 接口,由 Spring 类 HttpComponentsClientHttpRequestFactory 实现。在系统的其他地方,我们有一个用 @Configuration 注释的 Java 类,其中使用 @Autowired 注入 ManagedCloseableHttpClientFactory。像这样:
@Configuration
public class FooConfiguration {
@Autowired
private ManagedCloseableHttpClientFactory httpClientFactory;
...
}
Run Code Online (Sandbox Code Playgroud)
从命令行运行构建时,我们收到以下错误消息:/Users/xyz/source/prj/common/build/tmp/compileGroovy/groovy-java-stubs/common/web/client/ManagedCloseableHttpClientFactory.java: 10:错误: ManagedCloseableHttpClientFactory 不是抽象的,并且不会覆盖 ClientHttpRequestFactory 中的抽象方法 createRequest(URI,HttpMethod)。如果我们将标有 @Autowired 的字段移动到标有 @Configuration 注释的 Groovy 类,则一切正常,但在 Java 类中声明时则不然。我猜这是一个编译顺序问题。在我们的 Gradle 文件中,我们使用 groovy 插件,并修改了源目录,如下所示:
project.sourceSets.main.java.srcDirs = []
project.sourceSets.test.java.srcDirs = []
project.sourceSets.main.groovy.srcDirs = ["src/main/java", "src/main/groovy"]
project.sourceSets.main.resources.srcDirs += ["config"]
project.sourceSets.test.groovy.srcDirs += ["src/test/java","src/test/groovy"]
Run Code Online (Sandbox Code Playgroud)
这里最好的方法是什么?谢谢。
Groovy 编译器的存根生成器有一些限制。我最好的猜测是,您不能让 Java 调用由@Delegate. 我会尝试摆脱这种特定的 Java->Groovy 依赖性或这种特定的用法@Delegate(即手动实现委托)。
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |