混合Java / Groovy源的Gradle编译排序问题

时间:2014-09-22 17:53:40

标签: spring groovy 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
...
}

ClientHttpRequestFactory是Spring接口,由Spring类HttpComponentsClientHttpRequestFactory实现。在系统的其他地方,我们有一个用@Configuration注释的Java类,其中使用@Autowired注入ManagedCloseableHttpClientFactory。像这样:

@Configuration
public class FooConfiguration {
  @Autowired
  private ManagedCloseableHttpClientFactory httpClientFactory;
...
}

当从命令行运行构建时,我们收到以下错误消息: / Users / xyz / source / prj / common / build / tmp / compileGroovy / groovy-java-stubs / common / web / client / ManagedCloseableHttpClientFactory.java:10:error: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"]

这里最好的方法是什么?谢谢。

2 个答案:

答案 0 :(得分:1)

Groovy编译器的存根生成器有一些限制。我最好的猜测是你不能让Java调用由@Delegate实现的Groovy方法。我试图摆脱这个特定的Java-> Groovy依赖或@Delegate的这种特殊用法(即手动实现委托)。

答案 1 :(得分:0)

如果可能,请注入接口而不是具体类。由于注入发生在运行时,因此该类将完全创建,并且在编译时编译器将识别该接口具有所有必需的字段。

WITH cte AS 
 (
   SELECT Name AS inKey,
          id AS inString,
          comment
   FROM test
 ) 
SELECT * FROM 
 (
   SELECT * 
   FROM TABLE (STRTOK_SPLIT_TO_TABLE(cte.inKey
                                    ,cte.inString
                                    ,',["]') 
   RETURNS (outKey VARCHAR(40) 
           ,TokenNum INT 
           ,Token VARCHAR(20)) AS dt
 ) AS dt
JOIN cte
ON cte.inKey = dt.outKey