2014-10-25 7 views
10

मैं विकसित किया है और Maven का उपयोग कर मेरी जावा अनुप्रयोग का निर्माण किया। मैं जावा 1.6 का समर्थन करने की जरूरत है, तो मैं निम्नलिखित गुण का उपयोग करें:मैवेन निर्भरता के आवश्यक जावा संस्करण?

<maven.compiler.target>1.6</maven.compiler.target> 
<maven.compiler.source>1.6</maven.compiler.source> 

फिर भी, जब मैं आवेदन मैं एक "असमर्थित MAJOR.MINOR संस्करण" त्रुटि मिलती है चलाने के लिए और मुझे लगता है कि मेरी निर्भरता जार में से एक संकलित किया गया है एक जावा संस्करण के साथ मुझे समर्थन करने की आवश्यकता है।

मेरे सवालों का:

  1. यह और भी संभव है? मैंने सोचा कि मैवेन इस तरह की निर्भरता संस्करण समस्याओं का ख्याल रखेगा।

  2. वहाँ एक आसान तरीका अपने सभी निर्भरता की मामूली/मुख्य संस्करण पता लगाने के लिए है? (भयानक होगा अगर यह जब उदाहरण के लिए mvn dependency:tree कर दिखाया जा सकता है।)

+0

क्या आप अपनी पूरी मेवेन फ़ाइल पोस्ट कर सकते हैं? –

+0

कुछ सामान है जो मैं एसओ पर प्रमाण पत्र की जानकारी जैसे कि खुलासा नहीं करना चाहता हूं। लेकिन यहां प्रासंगिक भागों का एक अलग संस्करण है: http://pastebin.com/BE7yDbSV – aioobe

+3

ऐसा लगता है कि जर्सी 2.6 जावा 6 में संकलित अंतिम संस्करण था। उसके बाद यह जावा 7 था। संदर्भ: https: // जर्सी .java.net/दस्तावेज़ीकरण/नवीनतम/मॉड्यूल-और-निर्भरता.html –

उत्तर

13

समस्या यह है कि प्रत्येक निर्भरता (रखरखाव) इस पर निर्णय ले सकती है कि जावा संस्करण का उपयोग संकलन (1.5, 1.6, 1.7, 1.8 आदि) के लिए किया जाता है, इसलिए यह मेवेन के माध्यम से हल नहीं किया जा सकता है। लेकिन आप यह सुनिश्चित कर सकते हैं कि आप उन निर्भरताओं का उपयोग न करें जो आपके पास एक अलग जावा संस्करण का उपयोग कर रहे हैं।

यह extra-enforcer-rules का उपयोग करके Maven Enforcer Plugin का उपयोग करके enfored जा सकता है: यदि आप एक निर्भरता जो की तुलना में आप करना चाहते हैं JDK का एक अलग संस्करण के साथ संकलित किया गया है है

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-enforcer-plugin</artifactId> 
     <version>1.4.1</version> <!-- find the latest version at http://maven.apache.org/plugins/maven-enforcer-plugin/ --> 
     <executions> 
      <execution> 
      <id>enforce-bytecode-version</id> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
      <configuration> 
       <rules> 
       <enforceBytecodeVersion> 
        <maxJdkVersion>1.6</maxJdkVersion> 
        <excludes> 
        <exclude>org.mindrot:jbcrypt</exclude> 
        </excludes> 
       </enforceBytecodeVersion> 
       </rules> 
       <fail>true</fail> 
      </configuration> 
      </execution> 
     </executions> 
     <dependencies> 
      <dependency> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>extra-enforcer-rules</artifactId> 
      <version>1.0-beta-5</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 

यह अपने निर्माण टूट जाएगा।

+1

यह साफ है। मुझे लगता है कि ये नियम संक्रमणीय निर्भरताओं पर भी लागू होते हैं? –

+2

दस्तावेज़ों से उद्धरण: 'यह नियम निर्भरता को पारस्परिक रूप से जांचता है और विफल रहता है अगर किसी भी निर्भरता के किसी भी वर्ग को अपने निर्दिष्ट बाइटकोड संस्करण को निर्दिष्ट एक से अधिक है।' Http://mojo.codehaus.org/extra-enforcer-rules/ देखें ApplyBytecodeVersion.html – khmarbaise

+2

मुझे यहां आने के लिए कुछ googling ले लिया। बहुत सराहना की। – OliverS

0

अपने दो सवालों के जवाब देने के लिए:

हाँ, यह संभव है। docs पर देखकर, <maven.compiler.target> और <maven.compiler.source> गुण मेवेन को javac का संस्करण संकलित करने के लिए उपयोग करने के लिए केवल प्रोजेक्ट को देखने के लिए बताते हैं। और मैं बोली, आपके संदर्भ के लिए:

नोट: केवल लक्ष्य विकल्प सेट करने की गारंटी नहीं है कि आपके कोड वास्तव में निर्दिष्ट संस्करण के साथ एक JRE पर चलता है। ख़तरा एपीआई कि केवल बाद JREs जो एक सम्बन्ध त्रुटि के साथ कार्यावधि में असफल अपने कोड होगा में मौजूद अनायास ही उपयोग है। इस समस्या से बचने के लिए आपको या तो संकलक के बूट classpath लक्ष्य JRE से मेल खाते हैं या अनायास ही एपीआई का उपयोग नहीं करता अपने कोड सत्यापित करने के लिए पशु स्निफर Maven प्लगइन का उपयोग करने के लिए कॉन्फ़िगर कर सकते।

magic number के बाद Unsupported major.minor version त्रुटि वास्तव में JRE का संस्करण बताता वर्ग फ़ाइल के साथ संगत है:

J2SE 8 = 52, 
J2SE 7 = 51, 
J2SE 6.0 = 50, 
J2SE 5.0 = 49, 
JDK 1.4 = 48, 
JDK 1.3 = 47, 
JDK 1.2 = 46, 
JDK 1.1 = 45 

अगर वहाँ प्रमुख को बताने के लिए एक आसान तरीका/नाबालिग है मैं नहीं जानता हालांकि एक परियोजना में सभी निर्भरताओं (और transitive निर्भरता) का संस्करण।

अद्यतन: हालांकि मैंने पहले इसका उपयोग नहीं किया है, मुझे आश्चर्य है कि Animal Sniffer Maven plugin आपकी निर्भरताओं के प्रमुख/मामूली संस्करण को छीनने में मदद करेगा।

+1

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

+0

यह जानना अच्छा है। क्या मुझे अभी भी एक उथल-पुथल मिलती है? :) –

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