2015-04-01 6 views
7

मुझे हाल ही में पता चला कि lombok.jar हमारे अंतिम आर्टिफैक्ट में समाप्त होता है, जो आवश्यक नहीं होना चाहिए। मेरी समझ में lombok केवल संकलन समय है।लंबोक के लिए मेवेन स्कोप (संकलन बनाम प्रदान किया गया)

 <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <version>1.14.4</version> 
     </dependency> 

लेकिन जब मैं इसे प्रदान करने के लिए इसे सेट करता हूं, तो मुझे यूनिट परीक्षणों में अजीब व्यवहार मिलता है। वे तो ClassNotFoundExceptions साथ दुर्घटना जब

java.lang.NoClassDefFoundError: com/svv/esp/serviceimpl/dataimport/common/validation/LongValidator 

कौन सा गुंजाइश maven lombok के लिए इस्तेमाल किया सामान्य रूप में है को हल करने की कोशिश कर रहा?

मैं Oracle JDK MacOSX 10.9 पर निर्माण 1.8.0_25-B17

+0

अच्छी तरह से, आपको परीक्षण करने के लिए दायरे को सेट करने की आवश्यकता हो सकती है। आपके प्रश्न के लिए, मैं आमतौर पर इसे संकलित करने के लिए सेट करता हूं, लेकिन सिर्फ इसलिए कि मैं इसके साथ परेशान करने के लिए आलसी हूं: l –

उत्तर

5

आमतौर पर compile उपयोग कर रहा हूँ। provided जार के लिए है जो आमतौर पर एप्लिकेशन सर्वर के साथ भेज दिया जाता है जो एप्लिकेशन होस्ट करेगा। http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html

+1

lombok प्लगइन के लिए +1, उसे नहीं पता था। लेकिन फिर भी, यह मेरे लिए स्पष्ट नहीं है कि क्यों प्रदान किया गया है इस मामले में क्यों काम नहीं करता है। यह संकलन समय के दौरान उपलब्ध होना चाहिए और बाद के चरणों में अब आवश्यक नहीं होना चाहिए। – mkraemerx

+0

निश्चित होने के लिए मुझे कम से कम 'लॉन्ग वैलिडेटर' क्लास को देखना होगा जो कि गायब होने की संभावना है और शायद पोम में अन्य तत्वों की आवश्यकता है, लेकिन शायद 'प्रदान की गई' के साथ समस्या यह है कि जब संकलन स्थान लेता है तो लंबोक को अपना काम करना चाहिए, या रनटाइम में यदि आप संकलित करते समय इसे शामिल नहीं करते हैं और न ही लंबोक कोड उत्पन्न करते हैं, तो आपकी कक्षा इस तरह होगी जैसे कि लंबोक द्वारा संसाधित नहीं किया गया था। – EmirCalabuch

+1

आगे स्पष्टीकरण के लिए: लंबोक सिर्फ एक पुस्तकालय नहीं है, यह एक प्रोसेसर है जो संकलन के दौरान कोड को संशोधित करता है। इसलिए जब आप इसे 'प्रदत्त' स्कोप पर स्विच करते हैं, तो इसे संकलित करते समय इसे निष्पादित करने की आवश्यकता होती है, यह डिफ़ॉल्ट रूप से नहीं होगा (आप कमांड लाइन पर '-Dexec.classpathScope = "compile" को जोड़ने वाले लोम्बोक प्रोसेसर को चलाने के लिए मेवेन को मजबूर कर सकते हैं।) – EmirCalabuch

23

लंबोक provided दायरे में इस्तेमाल किया जाना चाहिए (देखें official docs): आप अंतिम आवेदन में जार नहीं करना चाहते हैं, यह शायद Maven प्लगइन के बजाय सीधे जार उपयोग करने के लिए सबसे अच्छा है।

कारण (जैसा टिप्पणियों में कहा गया है) यह है कि लोम्बोक एक संकलित-समय-उपकरण है। यही है, रनटाइम पर सभी पर इसकी आवश्यकता नहीं है। दायरे provided बनाकर, आप लम्बाक पुस्तकालयों को कंपाइलर के लिए उपलब्ध कराते हैं लेकिन यह आपके संकलित जार की निर्भरता नहीं है। इस प्रकार, आपका अंतिम जार लंबोक पर निर्भर नहीं होगा और इसे किसी भी तैनाती में शामिल करने की आवश्यकता नहीं है, जो निर्भरता और आपके नियोक्ता के आकार को कम कर देता है।

+2

एक साइड नोट के रूप में, यह बहुत से लोगों के लिए भ्रमित हो सकता है: मेवेन स्कोप 'संकलन' का अर्थ यह संकलन समय और रन टाइम पर उपलब्ध है। यदि दायरा 'प्रदान किया गया है 'यह केवल संकलन समय पर उपलब्ध है। Http://stackoverflow.com/questions/6646959 देखें –

संबंधित मुद्दे