2016-08-12 9 views
5

मैं GitHub पर HikariCP परियोजना की समीक्षा कर रहा हूँ, और यह घोषणा करता है कि यह "जावा 7 और जावा 8 Maven विरूपण साक्ष्य", उसके स्रोत कोड में, यह का उपयोग करता है समर्थन करता है, उपयोग करने के बावजूद कुछ जावा 8 विशेषताएं:कैसे कर सकता है एक परियोजना का समर्थन जावा 7 जावा 8 सुविधाओं

java.util.function.Consumer; 
java.util.function.Predicate; 
java.util.function.UnaryOperator; 

मुझे लगता है कि अगर इस परियोजना जावा 7 के साथ दूसरों के द्वारा संदर्भित की जा रही है, त्रुटि हो जाएगा। तो, यह परियोजना जावा 7 और जावा 8 को एक ही समय में कैसे समर्थन देती है?

+0

पुरानी टिप्पणी हो सकती है। –

+1

कोड के दो संस्करणों को बनाए रखने के बिना http://stackoverflow.com/questions/16143684/can-java-8-code-be-compiled-to-run-on-java-7-jvm यह करने के लिए कोई तरीका नहीं है – vempo

+0

प्रोजेक्ट से लिंक करें ताकि हम आपके प्रश्न का उत्तर दे सकें। यदि यह घोषणा करता है कि जावा 7 और जावा 8 कलाकृतियों दोनों समर्थित हैं, तो यह कहना मुश्किल है कि वास्तविक परियोजना को देखे बिना यह कैसे हासिल किया जाता है। मैं वे दो ** विभिन्न ** कलाकृतियों, जावा 7 के लिए एक और जावा 8. के ​​लिए अन्य – vempo

उत्तर

5

यह कोई गलती नहीं है (जैसा कि मैंने स्वयं सोचा था)। यह परियोजना वास्तव में जावा 8 से कक्षाओं का उपयोग करती है। यह जावा 7 के साथ संकलित नहीं है, और इसका मेवेन बिल्ड जावा 7 के साथ नहीं चलता है।

लेकिन, जैसा कि lambdas तरह जावा 8 विशिष्ट सुविधाओं का स्रोत कोड में कहीं नहीं उपयोग किया जाता है, यह जावा के साथ चलती है 7.

एक जावा 7 परियोजना बनाते समय एक निर्भरता के रूप में HikariCP घोषित करने, और चलाने की कोशिश करें निम्नलिखित कोड:

import com.zaxxer.hikari.util.FastList; 

public class Main { 

    public static void main(String[] args) { 

     FastList<String> fastList = new FastList<>(String.class); 
     fastList.add("Hello"); 
     System.out.println(fastList); 
    } 
} 

यह सफलतापूर्वक चलाता है। दूसरी ओर, निम्न कोड में विफल रहता है:

fastList.removeIf(null); 

इसका कारण यह है removeIf() और कुछ अन्य तरीकों जावा 8 से कक्षाओं का उपयोग, और इसलिए जावा 7. साथ नहीं चल सकता लेकिन वे सभी UnsupportedOperationExceptionवैसे भी फेंक! आप देख सकते हैं कि जावा 8 कक्षाओं को आयात करने वाला एकमात्र वर्ग com.zaxxer.hikari.util.FastList है। मुझे यकीन नहीं है कि उन्होंने ऐसा क्यों किया।

अद्यतन: बस यह स्पष्ट करना चाहता था कि परियोजना बाइटकोड का संस्करण 1.7 है, जिसे आसानी से एक डिकंपेलर या हेक्सडम्प के साथ सत्यापित किया जा सकता है। इसके स्रोत कोड जावा 7 के साथ पालन और इसलिए के रूप में @Puce द्वारा बताया

<source>1.7</source> 
<target>1.7</target> 

साथ निर्माण किया जा सकता है है।

दूसरी ओर, यह JDK 1.8 के साथ संकलित किया जाना चाहिए ताकि जावा 8 स्रोत कोड में संदर्भित वर्गों संकलन के दौरान उपलब्ध हैं। एक बार कोड संकलित हो जाने पर, यह जावा 7 के साथ तब तक चल सकता है जब तक लापता जावा 8 वर्ग (इस मामले में java.util.function पैकेज से) लोड करने के लिए कोई प्रयास नहीं किया जाता है।

+0

मैं प्रयास नहीं किया है लागू की जाती है, लेकिन यह अजीब लगता है कि JRE 7 एक वर्ग का संदर्भ जो प्रकार, जो उपलब्ध नहीं हैं ... – Puce

+0

@Puce लोड कर सकते हैं, मैं सहमत हैं, मुझे कुछ भी समझ में नहीं आया :) इसलिए मैंने यह समझने की कोशिश की कि यह कैसे संभव था और इस नमूना कोड के साथ आया। जावा 7 तब तक ठीक काम करता है जब तक यह वास्तव में जावा 8 कक्षाओं को लोड करने का प्रयास नहीं करता है। – vempo

+1

यदि प्लगइन प्रबंधन अनुभाग में प्लगइन कॉन्फ़िगर किया गया है, तो प्लगइन का उपयोग होने पर कॉन्फ़िगरेशन का उपयोग किया जाता है। कंपाइलर प्लगइन डिफ़ॉल्ट रूप से डिफ़ॉल्ट जीवन चक्र के संकलन चरण से जुड़ा हुआ है। आपको प्लगइन अनुभाग में इसे निर्दिष्ट करने की आवश्यकता नहीं है। – Puce

0
<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <extensions>true</extensions> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
</plugin> 

यह परियोजना की एक त्रुटि हो सकती है।

स्रोत और लक्ष्य स्तर निर्दिष्ट करना केवल भाषा विशेषताओं का सम्मान करता है और बाइट कोड संस्करण को प्रभावित करता है। एपीआई की जांच नहीं की जाती है।

यदि वे परियोजना बनाने के लिए जेडीके 8 का उपयोग कर रहे हैं, तो परियोजना ठीक बनाती है। लेकिन मुझे संदेह है कि यह जेडीके 7 के साथ संकलित होगा।

उन्होंने सोचा होगा कि 1.7 निर्दिष्ट करने से यह जावा एसई 7 का समर्थन करेगा, जो स्वचालित रूप से सही नहीं है।

क्या आपने जावा एसई 7 के साथ लाइब्रेरी तक पहुंचने का प्रयास किया है?

प्रोजेक्ट के लिए अच्छी खबर यह है कि जावा एसई 7 का समर्थन करना आसान लगता है। FastList सिर्फ एक सूची कार्यान्वयन है। चूंकि सूची इंटरफ़ेस जावा एसई 8 में बढ़ाया गया है, इसलिए उन्हें केवल एक असमर्थितऑपरेशन अपवाद फेंकने के साथ-साथ नई विधियों को लागू करने के लिए मजबूर होना पड़ा।

प्रोजेक्ट बनाने के लिए जेडीके 7 का उपयोग करके, वे आसानी से उन अनजान तरीकों को हटा सकते हैं।

+1

नई विधियां 'डिफ़ॉल्ट' विधियां हैं। कोई उन्हें लागू करने, चाहे, JDK आप का उपयोग करें ... – Holger

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