我在混合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"]
这里最好的方法是什么?谢谢。
答案 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