2014-09-22 66 views
4

我在混合的Java/Groovy環境中遇到編譯順序問題。我們使用Gradle 2.1,JDK 7和Groovy 2.3。該代碼在STS(Spring Tool Suite)中編譯得很好,使用Gradle插件和相同的build.gradle文件,但在命令行上運行構建時失敗。 STS被配置爲使用Groovy Eclipse插件,如果我理解正確,則使用它自己的編譯器。所以我認爲當我們使用Gradle的Groovy插件中的Groovy編譯器時,這個問題源於編譯順序問題。這是Groovy類:混合Java/Groovy源碼的Gradle編譯順序問題

@Component 
@ToString(includeNames = true, includePackage = false) 
class ManagedCloseableHttpClientFactory implements ClientHttpRequestFactory { 
    @Delegate 
    HttpComponentsClientHttpRequestFactory factory 
... 
} 

的ClientHttpRequestFactory是由Spring類HttpComponentsClientHttpRequestFactory實現一個Spring接口。在系統的其他地方,我們有一個用@Configuration註釋的Java類,其中的ManagedCloseableHttpClientFactory是使用@Autowired注入的。就像這樣:

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

當構建在命令行中運行,我們得到了以下錯誤消息:/用戶/ XYZ /源/ PRJ /普通/建設/ tmp目錄/ compileGroovy/Groovy的Java的存根/common/web/client/ManagedCloseableHttpClientFactory.java:10:錯誤:ManagedCloseableHttpClientFactory不是抽象的,也不覆蓋ClientHttpRequestFactory中的抽象方法createRequest(URI,HttpMethod)。如果我們將使用@Autowired標記的字段移動到使用@Configuration註釋的Groovy類,那麼一切正常,但不是在Java類中聲明的時候。我猜測這是一個編譯順序問題。在我們的搖籃文件,我們使用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"] 

這裏有什麼最好的方法?謝謝。

回答

1

Groovy編譯器的存根生成器有一些限制。我最好的猜測是你不能讓Java調用由@Delegate實現的Groovy方法。我試圖擺脫這種特定的Java-> Groovy依賴或@Delegate(即手工實現委託)的這種特定用法。

+1

感謝您的回覆。這個限制是否記錄在某個地方?你知道是否有計劃從Groovy開發人員處理這個限制? Groovy-Eclipse編譯器如何管理它,但不是Groovy發行版捆綁的那個?能夠在Eclipse/STS和命令行中使用相同的編譯器會很好。使用Gradle構建的美妙之處在於,我不必單獨管理Eclipse構建配置。但是,隨着兩種Groovy編譯器的風格,我不時遇到類似的問題。 – user2337270 2014-09-24 18:19:22

+0

我不知道有關存根生成器限制的任何文檔。有具體的計劃爲參考編譯器實現無關聯的聯合編譯,但是我不知道這個功能何時發佈(最好問Groovy人)。 Groovy Eclipse可能會始終有自己的聯合編譯器,它與Eclipse Java編譯器集成在一起。 (Eclipse不使用JDK Java編譯器。) – 2014-09-25 01:47:28

+0

感謝您的迴應Peter。你知道是否有使用Gradle的Groovy Eclipse編譯器的方法?這種方法會有什麼嚴重的缺點嗎?從我的天真的最終用戶的角度來看,我只是希望代碼能像Eclipse一樣順暢地進行編譯。 – user2337270 2014-09-26 03:42:32

0

如果可能的話注入接口而不是具體的類。由於注入在運行時發生,所以類將被完全創建,並且在編譯時,編譯器會將接口識別爲具有所有必需的字段。

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