2016-11-03 5 views
8

पृष्ठभूमि:Maven/Retrolambda: कैसे 8 वर्गों जावा पर निर्भरता का पता लगाने के

हम maven आधारित जावा परियोजना है, जो JRE 1.7 को लक्षित करता है, लेकिन स्रोत कोड lambdas का उपयोग करता है, तो हम Java 8 बदलने के लिए retrolambda का उपयोग स्रोत कोड Java 7 पर। इसके अलावा हम StreamSupport backport लाइब्रेरी का उपयोग जब हम नदियों की जरूरत है, कार्य करते हैं। *, वैकल्पिक, आदि retrolambda की

प्रयोग 1.8 करने के लिए परियोजना की दोनों स्रोत और लक्ष्य भाषा के स्तर को विन्यस्त करना शामिल है।

सब कुछ ठीक काम करता है अगर वहाँ java8 वर्ग या तरीकों पर कोई निर्भरता (जैसे java.util.stream.*, java.util.Optional, या तरीकों java8Collection.forEach तरह से प्रारंभ) कर रहे हैं। अगर वहाँ इस तरह के प्रयोगों तो गुजरता निर्माण कर रहे हैं, लेकिन यह, क्रम में विफल रहता है जब जावा 8. की JVM के तहत चल रहा

प्रश्न:

मेरा लक्ष्य मामले में निर्माण विफल जब इस तरह निर्भरता मौजूद है। क्या बिल्ड-टाइम में नए Java 8 वर्ग/विधियों पर निर्भरताओं का पता लगाने का कोई तरीका है?

मैं के बारे में 2 संभव विकल्प सोचा, लेकिन मुझे यकीन है कि क्या उनमें से या तो संभव है नहीं कर रहा हूँ:

  1. पूर्वनिर्धारित वर्गों और तरीकों पर depdencies पता लगाने के लिए बाईटकोड विश्लेषक के कुछ प्रकार। क्या ऐसे उपकरण/मेवेन प्लगइन्स हैं?
  2. लिंट (lint4j) नियम। सुनिश्चित नहीं हूं कि यह lint
+3

जावा 7 स्थापना के 'rt.jar' को इंगित करते समय बस संकलित करते समय बूटस्ट्रैप क्लासपाथ को बदलें। संकलक को लैम्ब्डा अभिव्यक्तियों के साथ काम करने के लिए, आपको पथ में एक डमी जार जोड़ना पड़ सकता है, जिसमें 'लैम्ब्डा मेटा फैक्ट्री' वर्ग होता है जिसमें संकलन की पुष्टि होती है, यदि संकलक इसे सत्यापित करता है। उन्हें काम करने की ज़रूरत नहीं है, फिर भी आप संकलित कोड को रेट्रोलंबडा के साथ संसाधित करेंगे (फिर, वास्तविक जेआरई 8 के साथ)। – Holger

+2

होल्गर के बाद, यह प्रक्रिया मेरे लिए काम करती है: जेएमई ''rt.jar' के अंदर' लैम्ब्डा कॉन्टेरियंस अपवाद ',' लैम्ब्डा मेटाफैक्टरी 'और' सीरियलाइज्डलैम्डा 'के लिए स्टब्स डालें (एक अतिरिक्त डमी जार का उपयोग करके मेरे मामले में काम नहीं किया। मुझे" घातक त्रुटि: क्लासपाथ या बूटक्लासपैथ में पैकेज java.lang को खोजने में असमर्थ ")। फिर maven-compiler-plugin को बढ़ाए गए rt.jar पर अपने '' टैग के माध्यम से इंगित करें। एक परीक्षण के रूप में, मैंने [streamsupport] (https://sourceforge.net/projects/streamsupport/) स्रोतों को संकलित किया (sans j8.u.DelegatingSpliterator जो जावा 8 एपीआई का उपयोग करता है और इसलिए जावा 7 rt.jar के साथ संकलित नहीं है) । –

+0

जेआरई 7 के साथ अपना टेस्ट सूट चलाने का एक तरीका हो सकता है। यदि आप जावा 8 एपीआई का उपयोग करते हैं तो अपवादों को फेंक दिया जाना चाहिए। –

उत्तर

5

का उपयोग कर आप इस के लिए उपयोग कर सकते हैं Animal Sniffer Maven Plugin वर्ग/विधि पर निर्भरता पता लगाने के लिए संभव है। यह आपको यह जांचने की अनुमति देता है कि आपका कोड केवल निर्दिष्ट आधार रेखा से एपीआई का उपयोग करता है (जिसे "हस्ताक्षर" कहा जाता है)। आपके मामले में आप org.codehaus.mojo.signature का उपयोग करेंगे: जावा 17: 1.0 हस्ताक्षर।

जैसा कि अन्य ने इंगित किया है, आप बूटस्ट्रैप क्लासपाथ भी सेट कर सकते हैं, लेकिन ए) को एक जेडीके 7 स्थापित करने की आवश्यकता है और बी) थोड़ा और जटिल बनाता है क्योंकि आपको जेडीके 7 इंस्टॉल करने की आवश्यकता है । मेरे अनुभव में काम करने के लिए पशु स्निफर का काम करना बहुत आसान है।

+1

धन्यवाद! बस कोशिश की - एक आकर्षण की तरह काम करता है :) –

+0

अच्छा, सुनकर खुशी हुई। – Gunnar

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