2013-01-21 13 views
5

के भीतर कक्षाओं में परिभाषित चर का उपयोग करने में सक्षम नहीं है। मैं ड्रॉपवार्ड उदाहरणों से जावा से ग्रोवी तक कुछ कोड पोर्ट करने का प्रयास कर रहा हूं।ग्रोवी एनोटेशन

मुझे लगता है कि जावा के भीतर, मैं निम्नलिखित कोड किसी भी मुद्दे के बिना उपयोग कर सकते हैं:, ग्रूवी संकलक (दोनों 1.8 और 2.0.6) के साथ

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

@Produces(MediaType.APPLICATION_JSON) 
public class HelloWorldService{ 

} 

हालांकि, वर्ग एक noClassFoundException साथ संकलित करने के लिए विफल रहता है MediaType.APPLICATION_JSON

आसपास

अगर मैं वास्तविक स्ट्रिंग मान

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

} 

सब कुछ पूरी तरह से काम करता है का उपयोग करने के लिए इस कोड को बदल जाते हैं।

क्या ग्रोवी एनोटेशन और जिस तरह से जावा करता है, उसके बीच कोई अंतर है?

पूर्णता के लिए, यह एक 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.sun.ws.rs.ext.RuntimeDelegateImpl ... 17 अधिक की वजह से। sun.ws.rs.ext.RuntimeDe org.gradle.api.internal.tasks.compile.TransformingClassLoader.findClass (TransformingClassLoader.java:47)

+0

क्या यह '@Produces (javax.ws.rs.core.MediaType.APPLICATION_JSON) ' –

+0

के साथ काम करता है, नहीं, लेकिन यह त्रुटि नहीं करता है लेकिन त्रुटि मुझे लगता है कि यह एक ग्रोवी की बजाय एक धीरे-धीरे चीज हो सकती है चीज –

+0

एक ग्रेबल बग प्रतीत होता है क्योंकि मैं ग्रोवी-ग्रहण और मेवेन का उपयोग करके समीकरण को संकलित करने में सक्षम हूं। –

उत्तर

6

समस्या, ग्रूवी संकलक का एक दुर्भाग्यपूर्ण सीमा के कारण होता है अर्थात् है कि यह करने के लिए प्रतिबिंब का उपयोग करता है पर legateImpl संकलन वर्ग पथ पर कक्षाओं का उपयोग करें। यह बदले में अन्य वर्गों को लोड करने के लिए ट्रिगर कर सकता है, जो संकलन वर्ग पथ पर उपलब्ध नहीं हो सकता है। आम तौर पर (लेकिन हमेशा नहीं) ये रनटाइम निर्भरता हैं।

ठोस मामले में, ग्रूवी संकलक लोड javax.ws.rs.core.MediaType प्रतिबिंब है, जो अंततः com.sun.ws.rs.ext.RuntimeDelegateImpl में जो परिणाम के माध्यम से Class.forName (एक स्थिर प्रारंभकर्ता से शुरू हो रहा है), जो संकलन वर्ग रास्ते पर नहीं है के माध्यम से लोड किए जा रहे। समाधान उस कक्षा को संकलित वर्ग पथ पर रखना है। (लंबे समय तक, समाधान स्टैंडअलोन ग्रोवी कंपाइलर को प्रतिबिंब का उपयोग न करने के लिए ठीक करना है, और जो मुझे पता है उससे पहले से ही कतार में है।) यदि आपके मॉड्यूल की ट्रांजिटिव निर्भरता कोई समस्या नहीं है, तो इसे प्राप्त करने का सबसे आसान तरीका है:

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

मुझे लगता है कि ग्रहण ग्रूवी संकलक इस समस्या नहीं है, क्योंकि यह संकलन वर्ग पथ में पहुंचने प्रतिबिंब का उपयोग नहीं करता। मैं उम्मीद करता हूं कि जीएमवेन ग्रैडल की तरह उड़ाएगा, जब तक कि यह ग्रहण कंपाइलर (जो वर्तमान में ग्रैडल द्वारा समर्थित नहीं है) का उपयोग करने के लिए कॉन्फ़िगर किया गया हो।