2016-08-10 5 views
45

मैं मैवेन के साथ बहुत अनुभवी नहीं हूं और बहु-मॉड्यूल प्रोजेक्ट के साथ प्रयोग करते समय मैंने सोचा कि मैं माता-पिता मेवेन पोम में अपने सभी बाल मॉड्यूल के लिए जावा संस्करण कैसे निर्दिष्ट कर सकता हूं। आज तक मैं सिर्फ उपयोग कर रहा था:मैवेन में जावा संस्करण निर्दिष्ट करना - गुणों और कंपाइलर प्लगइन के बीच अंतर

<properties> 
    <java.version>1.8</java.version> 
</properties> 

लेकिन जब शोध मैंने पाया कि आप भी Maven संकलक प्लगइन में जावा संस्करण निर्दिष्ट कर सकते हैं, इस तरह:

<plugins> 
    <plugin>  
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
    </plugin> 
</plugins> 

और फिर करने के लिए प्लगइन प्रबंधन टैग में इस लपेट इस के बच्चे के पोम्स उपयोग को सक्षम करें। तो पहला सवाल गुणों में और मेवेन कंपाइलर प्लगइन में जावा संस्करण को बदलने के अंतर क्या हैं?

मैं स्पष्ट उत्तर नहीं मिल सकता है, लेकिन मैंने पाया कि आप भी इस तरह से जावा संस्करण निर्दिष्ट कर सकते हैं शोध करने की प्रक्रिया में:

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 

जो कि संकलक प्लगइन का सुझाव है, भले ही मैं स्पष्ट घोषणा न यह।

maven-compiler-plugin:3.1:compile (default-compile) @ testproj --- 

और कुछ अन्य प्लगइन्स जिन्हें मैंने घोषित नहीं किया है, के साथ एमवीएन पैकेज आउटपुट चलाना। तो क्या वे प्लगइन डिफ़ॉल्ट हैं, मेवेन पोम का छुपा हिस्सा? गुणों में और maven प्लगइन विन्यास तत्व में कोई अंतर beetwen सेटिंग स्रोत/लक्ष्य हैं?

कुछ अन्य प्रश्न हैं - किस तरह से उपयोग किया जाना चाहिए (और जब वे बराबर नहीं हैं)? मल्टी-मॉड्यूल प्रोजेक्ट के लिए कौन सा सबसे अच्छा है और क्या होता है यदि जावा में निर्दिष्ट जावा संस्करण JAVA_HOME में संस्करण के मुकाबले अलग है?

उत्तर

72

मैवेन package लक्ष्य के निष्पादन पर आउटपुट में संकलक प्लगइन का पता लगाया गया है भले ही आप इसे pom.xml में निर्दिष्ट न करें?

अपने कोड को संकलित करने के लिए और आमतौर पर एक मेवेन लक्ष्य के लिए आवश्यक सभी कार्यों को करने के लिए, मैवेन को उपकरण की आवश्यकता होती है। इसलिए, यह मूल मेवेन प्लगइन्स का उपयोग करता है (आप अपने groupId: org.apache.maven.plugins द्वारा कोर मैवेन प्लगइन को पहचानते हैं) आवश्यक कार्यों को करने के लिए: कक्षाओं को संकलित करने के लिए कंपाइलर प्लगइन, परीक्षण निष्पादित करने के लिए परीक्षण प्लगइन, और इसलिए ... तो, यदि आप भी नहीं करते हैं इन प्लगइन्स की घोषणा नहीं करते हैं, वे मेवेन लाइफसाइकिल के निष्पादन के लिए बाध्य हैं।

अपने मेवेन प्रोजेक्ट की रूट डायर पर, आप अंतिम पोम प्रभावी रूप से उपयोग करने के लिए कमांड चला सकते हैं: mvn help:effective-pom। आप अन्य जानकारी, मैवेन द्वारा निर्दिष्ट प्लगइन (निर्दिष्ट या अपने pom.xml में नहीं) के साथ, इस्तेमाल किए गए संस्करण, उनके कॉन्फ़िगरेशन और जीवन चक्र के प्रत्येक चरण के लिए निष्पादित लक्ष्यों के साथ देख सकते हैं।

mvn help:effective-pom आदेश के उत्पादन में, आप <build><plugins> तत्व में इन मूल प्लग इन की घोषणा देख सकते हैं, उदाहरण के लिए:

... 
<plugin> 
    <artifactId>maven-clean-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
    <execution> 
     <id>default-clean</id> 
     <phase>clean</phase> 
     <goals> 
     <goal>clean</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
    <execution> 
     <id>default-testResources</id> 
     <phase>process-test-resources</phase> 
     <goals> 
     <goal>testResources</goal> 
     </goals> 
    </execution> 
    <execution> 
     <id>default-resources</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>resources</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.1</version> 
    <executions> 
    <execution> 
     <id>default-compile</id> 
     <phase>compile</phase> 
     <goals> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    <execution> 
     <id>default-testCompile</id> 
     <phase>test-compile</phase> 
     <goals> 
     <goal>testCompile</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
    ... 

आप the introduction of the Maven lifeycle in the Maven documentation में इसके बारे में अधिक जानकारी हो सकती है।

फिर भी, आप इन प्लगइन्स को घोषित कर सकते हैं जब आप उन्हें अन्य मानों के साथ डिफ़ॉल्ट मानों के रूप में कॉन्फ़िगर करना चाहते हैं (उदाहरण के लिए, आपने इसे तब किया जब आपने अपने pom.xml में मेवेन-कंपाइलर प्लगइन को जेडीके संस्करण का उपयोग करने के लिए समायोजित किया) या जब आप कुछ प्लगइन निष्पादन जोड़ना चाहते हैं जो मेवेन लाइफसाइकिल में डिफ़ॉल्ट रूप से उपयोग नहीं किया जाता है।


जेडीके संस्करण को कैसे निर्दिष्ट करें?

1) <java.version> मैवेन दस्तावेज़ में संदर्भित नहीं है। यह एक वसंत बूट विशिष्टता है।
व्यक्तिगत रूप से मुझे अब के लिए उपयोग करने के लिए पर्याप्त मानक नहीं मिला है।
वसंत बूट कुछ बहुत ही रोचक विशेषताएं प्रदान करता है लेकिन कुछ मामलों में ये विवादास्पद हो सकते हैं।
स्रोत और लक्ष्य जावा संस्करण दोनों को भरने के लिए मानक मैवेन संपत्ति के नाम को ओवरराइड करना एक अच्छा व्यापार-बंद आवश्यक नहीं है।
पूरे एप्लिकेशन में एक कॉन्फ़िगरेशन लाइन को छोड़ने के लिए आप एक मेवेन मानक कॉन्फ़िगरेशन खो देते हैं।

2) इस घोषणा:

<plugins> 
    <plugin>  
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
    </plugin> 
</plugins> 

और यह अन्य घोषणा:

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 

Maven documentation of the compiler plugin <source> के बाद से और संकलक विन्यास में <target> तत्वों गुणों का उपयोग के अनुसार बराबर हैं maven.compiler.source और maven.compiler.target यदि वे परिभाषित किए गए हैं (अन्यथा डिफ़ॉल्ट रूप से 1.5)।

स्रोत स्ट्रिंग 2,0

जावा के लिए स्रोत तर्क। डिफ़ॉल्ट मान है: 1.5। उपयोगकर्ता संपत्ति है: maven.compiler.source।

लक्ष्य स्ट्रिंग 2,0

जावा के लिए -target तर्क। डिफ़ॉल्ट मान है: 1.5। उपयोगकर्ता संपत्ति है: maven.compiler.target।


कौन सा JDK संस्करण निर्दिष्ट करने के लिए सबसे अच्छा तरीका है?

आप एक या दूसरे का उपयोग कर सकते हैं। यह तथ्यों में कुछ भी नहीं बदलता है क्योंकि आखिरकार दो समाधान समान गुणों और समान तंत्र पर भरोसा करते हैं: मेवेन कोर कंपाइलर प्लगइन।

ठीक है, आप अन्य संपत्तियों या संकलक प्लगइन में जावा संस्करणों की तुलना में व्यवहार, इस तरह का उपयोग कर अधिक समझ में आता है निर्दिष्ट करने के लिए के रूप में इस अधिक संक्षिप्त है की जरूरत नहीं है, तो:

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 

क्या होगा अगर ऐसा होता है संस्करण JAVA_HOME में जेडीके के बीच अलग है और कौन सा pom.xml में निर्दिष्ट है?

यह कोई समस्या नहीं है यदि JAVA_HOME द्वारा संदर्भित जेडीके पोम में निर्दिष्ट संस्करण के साथ संगत है।
विचार करने के लिए एक महत्वपूर्ण बात यह है कि मेवेन कॉन्फ़िगरेशन में स्रोत और लक्ष्य संस्करण JAVE_HOME द्वारा संदर्भित जेडीके संस्करण से बेहतर नहीं होना चाहिए।
जेडीके का एक पुराना संस्करण एक नवीनतम संस्करण के साथ संकलित नहीं कर सकता क्योंकि यह इसके विनिर्देश को नहीं जानता है।

जावा 7 के लिए, वैध जावा रिहाई स्रोत संस्करण हैं:

1,3, 1.4, 1.5 (भी 5), 1.6 (भी 6), और 1.7 (भी 7)।

और ये वैध जावा रिहाई लक्ष्य संस्करण हैं:

1,1, 1.2, 1.3, 1.4, 1.5 (भी 5), 1.6 (भी 6), और 1.7 (भी 7)।

जैसा कि पहले कहा गया था, यह जावा 8 को मान्य लक्ष्य या स्रोत के रूप में निर्दिष्ट नहीं करता है क्योंकि यह इसके विनिर्देश को नहीं जानता है।

जावा 8, वैध जावा रिहाई स्रोत के लिए संस्करण हैं:

1,3, 1.4, 1.5 (भी 5), 1.6 (भी 6), 1.7 (भी 7), और 1.8 (8 भी)।

और ये वैध जावा रिहाई लक्ष्य संस्करण हैं:

1,1, 1.2, 1.3, 1.4, 1.5 (भी 5), 1.6 (भी 6), 1.7 (भी 7) , और 1.8 (8 भी)।

आप the javac documentation for JDK 1.8

में अधिक जानकारी के हो सकता था कैसे संभाल JDK के मामले JAVA_HOME द्वारा संदर्भित जावा लक्ष्य और/या स्रोत संस्करणों पोम में निर्दिष्ट के साथ संगत नहीं है?

उदाहरण के लिए, यदि अपने JAVA_HOME एक JDK 1.7 को संदर्भित करता है और आप स्रोत और अपने pom.xml का संकलक विन्यास में लक्ष्य के रूप में एक JDK 1.8 निर्दिष्ट करते हैं, यह एक समस्या है क्योंकि के रूप में समझाया हो जाएगा, JDK 1.7 नहीं करता ' टी के साथ संकलन करने के लिए पता है।
अपने दृष्टिकोण से, यह एक अज्ञात जेडीके संस्करण है क्योंकि इसे इसके बाद जारी किया गया था।
इस मामले में, आप इस तरह से JDK निर्दिष्ट करने के लिए Maven संकलक प्लगइन कॉन्फ़िगर करना चाहिए:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.8</source> 
     <target>1.8</target> 
     <compilerVersion>1.8</compilerVersion>  
     <fork>true</fork> 
     <executable>D:\jdk1.8\bin\javac</executable>     
    </configuration> 
</plugin> 

आप examples with maven compiler plugin में अधिक जानकारी के हो सकता था।


यह नहीं कहा है, लेकिन ऐसे मामलों में जहां कि और अधिक जटिल हो सकता है जब आप स्रोत निर्दिष्ट लेकिन लक्षित नहीं है। यह स्रोत संस्करण के अनुसार लक्ष्य में एक अलग संस्करण का उपयोग कर सकते हैं।नियम विशेष हैं:

- लक्ष्य संस्करण क्लास मशीन जेनरेट करता है जो वर्चुअल मशीन के निर्दिष्ट रिलीज़ को लक्षित करता है। क्लास फाइल निर्दिष्ट लक्ष्य और बाद में रिलीज़ पर चलेंगी, लेकिन JVM की पूर्व रिलीज़ पर नहीं। मान्य लक्ष्य 1.1, 1.2, 1.3, 1.4, 1.5 (5 भी), 1.6 (6 भी), 1.7 (7 भी), और 1.8 (8) भी हैं।

-target विकल्प के लिए डिफ़ॉल्ट स्रोत विकल्प के मूल्य पर निर्भर करता है:

स्रोत विकल्प निर्दिष्ट नहीं है, तो -target विकल्प के मूल्य है 1.8

यदि स्रोत विकल्प 1.2 है, तो -target विकल्प के मूल्य 1,4

है स्रोत विकल्प, 1.3 है तो -target विकल्प के मूल्य 1.4

012,351,641 है

तो स्रोत विकल्प, 1.5 है तो -target विकल्प के मूल्य 1,8

है स्रोत विकल्प, 1.6 है तो -target का मूल्य विकल्प 1,8

तो है स्रोत विकल्प 1.7 है, तो -target का मूल्य विकल्प 1.8

स्रोत विकल्प के अन्य सभी मूल्यों के लिए है, -target विकल्प के मूल्य स्रोत विकल्प के मूल्य है।

+0

व्यापक स्पष्टीकरण के लिए धन्यवाद, अब यह मेरे लिए बहुत स्पष्ट है। इसके अलावा - मैंने इसे कुछ कोड स्निपेट में देखा है, शायद यह कुछ कस्टम प्रॉपर्टी थी और मैंने गलत तरीके से माना कि जावा संस्करण घोषित करने का यह तरीका है, अब से संपत्ति '। – Plebejusz

+0

आपका स्वागत है, खुशी के साथ :) प्रारंभ में, यह इतना विकसित करने का मेरा इरादा नहीं था, लेकिन जब मैंने शुरू किया, तो मैं नहीं रुक सकता था :) '' के लिए यह बहुत संभावना है। आप और अच्छे मैवेन देखें! – davidxxx

+1

"* यह कोई समस्या नहीं है यदि आपके JAVA_HOME का जेडीके पोम में निर्दिष्ट संस्करणों के साथ संगत है *" यह (जरूरी नहीं) सत्य है, [यह] जांचें (http://stackoverflow.com/questions/35913775/ मैवेन-जावा-वर्जन-कॉन्फ़िगरेशन-अनदेखा-बाय-एक्लिप्स-विचार) संदर्भ –

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