2013-01-21 91 views
5

我想從Dropwizard示例中的java代碼移植一些代碼到groovy。不能使用Groovy註解中的類中定義的變量

我看到的Java中,我可以使用下面的代碼沒有任何問題:

package com.example.helloworld; 
import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 

@Produces(MediaType.APPLICATION_JSON) 
public class HelloWorldService{ 

} 

然而,與常規的編譯器(包括1.8和2.0.6),類失敗並noClassFoundException編譯各地MediaType.APPLICATION_JSON

如果我改變了代碼,使用實際的字符串值

@Produces('application/json') 
public class HelloWorldService{ 

} 

一切完美。

groovy解決註釋的方式和java的方式有什麼區別嗎?

爲了完整,這是一個gradle這個項目的一部分,這裏是我的build.gradle(文件依次在src /常規/ COM /例子/的HelloWorld)

apply plugin: 'groovy' 

// Set our project variables 
project.ext { 
    dropwizardVersion = '0.6.1' 
} 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile group: 'com.yammer.dropwizard', name: 'dropwizard-core', version: dropwizardVersion 
    groovy group: 'org.codehaus.groovy', name: 'groovy-all', version: '1.8.7' 
} 

的編譯錯誤是:

產生的原因:了java.lang.RuntimeException: 拋出java.lang.ClassNotFoundException: 拋出java.lang.ClassNotFoundException: COM com.sun.ws.rs.ext.RuntimeDelegateImpl ... 17由多個所致。 sun.ws.rs.ext.RuntimeDe legateImpl在 org.gradle.api.internal.tasks.compile.TransformingClassLoader.findClass(TransformingClassLoader.java:47)

+0

是否與'@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)工作' –

+0

沒有,它沒有---但錯誤讓我覺得這可能是一個gradle這個事情,而不是一個常規東西 –

+0

似乎是一個gradle bug,因爲我能夠使用groovy-eclipse和maven編譯相同的東西。 –

回答

6

問題是由Groovy編譯器的一個不幸的限制引起的,即它使用反射來訪問編譯類路徑上的類。這可能反過來觸發其他類被加載,這可能在編譯類路徑上不可用。通常(但不總是)這些是運行時依賴關係。

在具體情況下,Groovy編譯器負載javax.ws.rs.core.MediaType經由反射,這最終導致com.sun.ws.rs.ext.RuntimeDelegateImpl經由Class.forName(由靜態初始化觸發),這是不編譯的類路徑上加載。解決方法是將該類放在編譯類路徑上。 (從長遠來看,解決方案是修復獨立的Groovy編譯器不使用反射,並且從我知道這已經在隊列中。)如果您的模塊的傳遞依賴不是問題,實現此目的的最簡單方法是:

dependencies { 
    compile "com.sun.jersey:jersey-client:1.15" 
} 

我懷疑Eclipse Groovy編譯器沒有這個問題,因爲它不使用反射來訪問編譯類路徑。我希望GMaven像Gradle一樣爆炸,除非它被配置爲使用Eclipse編譯器(Gradle當前不支持)。