JDK संस्करण कैसे निर्दिष्ट करें?
1) <java.version>
मावेन प्रलेखन में संदर्भित नहीं है।
यह एक स्प्रिंग बूट विशिष्टता है।
यह स्रोत और लक्ष्य जावा संस्करण को एक ही संस्करण के साथ सेट करने की अनुमति देता है जैसे कि यह दोनों के लिए जावा 1.8 निर्दिष्ट करने के लिए है:
<properties>
<java.version>1.8</java.version>
</properties>
यदि आप स्प्रिंग बूट का उपयोग करते हैं तो इसका बेझिझक उपयोग करें।
2) का उपयोग maven-compiler-plugin
और maven.compiler.source
/ maven.compiler.target
गुण निर्दिष्ट करने के लिए source
और target
समतुल्य हैं।
<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>
संकलक प्लगइन के मावन प्रलेखन के अनुसार समतुल्य हैं
क्योंकि <source>
और <target>
संकलक विन्यास में तत्व गुणों का उपयोग करते हैं maven.compiler.source
और maven.compiler.target
यदि वे परिभाषित हैं।
स्रोत
-source
जावा के लिए तर्क।
डिफ़ॉल्ट मान है: 1.6
।
उपयोगकर्ता संपत्ति है: maven.compiler.source
।
लक्ष्य
-target
जावा के लिए तर्क।
डिफ़ॉल्ट मान है: 1.6
।
उपयोगकर्ता संपत्ति है: maven.compiler.target
।
के लिए डिफ़ॉल्ट मानों के बारे में source
और target
, ध्यान दें कि
maven संकलक के बाद से 3.8.0
, डिफ़ॉल्ट मानों से बदल गया 1.5
है1.6
।
3) मावेन-कंपाइलर-प्लगइन 3.6
और बाद के संस्करण एक नया तरीका प्रदान करते हैं:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
आप भी सिर्फ घोषणा कर सकते हैं:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
लेकिन इस समय यह maven-compiler-plugin
आपके द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट संस्करण के रूप में काम नहीं करेगा, हाल ही में पर्याप्त संस्करण पर भरोसा नहीं करता है।
मावेन release
तर्क बताता है release
: एक नया JVM मानक विकल्प जिसे हम जावा 9 से पास कर सकते हैं:
एक विशिष्ट वीएम संस्करण के लिए सार्वजनिक, समर्थित और प्रलेखित एपीआई के खिलाफ संकलन।
यह तरीका source
, target
और bootstrap
JVM विकल्पों के लिए समान संस्करण को निर्दिष्ट करने का एक मानक तरीका प्रदान करता है ।
ध्यान दें कि bootstrap
क्रॉस संकलनों के लिए एक अच्छा अभ्यास निर्दिष्ट है और यदि आप क्रॉस संकलन नहीं करते हैं तो यह चोट नहीं पहुंचेगी।
JDK संस्करण को निर्दिष्ट करने का सबसे अच्छा तरीका कौन सा है?
पहले तरीके ( <java.version>
) की अनुमति केवल तभी दी जाती है जब आप स्प्रिंग बूट का उपयोग करते हैं।
जावा 8 और उससे नीचे के लिए:
दो अन्य तरीकों के बारे में: maven.compiler.source
/ maven.compiler.target
संपत्तियों का मूल्य निर्धारण या इसका उपयोग करके maven-compiler-plugin
, आप एक या दूसरे का उपयोग कर सकते हैं। यह तथ्यों में कुछ भी नहीं बदलता है क्योंकि आखिरकार दो समाधान एक ही गुण और एक ही तंत्र पर निर्भर करते हैं: मावेन कोर कंपाइलर प्लगइन।
ठीक है, अगर आपको संकलक प्लगइन में जावा संस्करणों की तुलना में अन्य गुणों या व्यवहार को निर्दिष्ट करने की आवश्यकता नहीं है, तो इस तरह से उपयोग करना अधिक समझ में आता है क्योंकि यह अधिक संक्षिप्त है:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
जावा 9 से:
release
तर्क (तीसरा बिंदु) एक तरह से दृढ़ता से विचार करने के लिए आप स्रोत और लक्ष्य के लिए एक ही संस्करण उपयोग करना चाहते हैं है।
यदि संस्करण JDA_HOME में JDK के बीच भिन्न होता है और pom.xml में कौन-सा निर्दिष्ट है?
यह एक समस्या नहीं है अगर जेडीके द्वारा संदर्भित JAVA_HOME
पॉम में निर्दिष्ट संस्करण के साथ संगत है लेकिन एक बेहतर क्रॉस-संकलन संगतता सुनिश्चित करने के लिए bootstrap
जेवीएम विकल्प rt.jar
को target
संस्करण के मार्ग के मूल्य के साथ जोड़ने के बारे में सोचें ।
एक महत्वपूर्ण बात पर विचार करना है कि है source
और target
Maven विन्यास में संस्करण के द्वारा संदर्भित JDK संस्करण के लिए बेहतर नहीं होना चाहिए JAVA_HOME
।
JDK का एक पुराना संस्करण अधिक हाल के संस्करण के साथ संकलित नहीं कर सकता है क्योंकि यह इसके विनिर्देश को नहीं जानता है।
स्रोत के बारे में जानकारी प्राप्त करने के लिए, उपयोग किए गए JDK के अनुसार समर्थित संस्करणों को लक्षित और जारी करें, कृपया जावा संकलन का उल्लेख करें : स्रोत, लक्ष्य और समर्थित संस्करण जारी करें ।
JAVA_HOME द्वारा संदर्भित JDK के मामले को कैसे हैंडल करें जो pom में निर्दिष्ट जावा लक्ष्य और / या स्रोत संस्करणों के साथ संगत नहीं है?
उदाहरण के लिए, यदि आपका JAVA_HOME
JDK 1.7 को संदर्भित करता है और आप JDK 1.8 को स्रोत के रूप में निर्दिष्ट करते हैं और अपने pom.xml के संकलक विन्यास में लक्ष्य करते हैं, तो यह एक समस्या होगी क्योंकि जैसा कि समझाया गया है, JDK 1.7 यह नहीं जानता है कि इसका अनुपालन कैसे करें ।
अपने दृष्टिकोण से, यह एक अज्ञात JDK संस्करण है क्योंकि यह इसके बाद जारी किया गया था।
इस स्थिति में, आपको JDK को इस तरह निर्दिष्ट करने के लिए मावेन कंपाइलर प्लगइन को कॉन्फ़िगर करना चाहिए:
<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>
आपके पास maven संकलक प्लगइन के साथ उदाहरणों में अधिक विवरण हो सकते हैं ।
यह पूछा नहीं जाता है, लेकिन ऐसे मामले जो अधिक जटिल हो सकते हैं, जब आप स्रोत निर्दिष्ट करते हैं, लेकिन लक्ष्य नहीं। यह स्रोत संस्करण के अनुसार लक्ष्य में एक भिन्न संस्करण का उपयोग कर सकता है। नियम विशेष हैं: आप उनके बारे में क्रॉस-संकलन विकल्प भाग में पढ़ सकते हैं ।
कंपाइलर आउटपुट को मावेन package
गोल के निष्पादन पर आउटपुट में क्यों ट्रेस किया जाता है, भले ही आप इसे pom.xml में निर्दिष्ट न करें?
मावेन गोल के लिए आवश्यक सभी कार्यों को करने के लिए अपने कोड और अधिक सामान्यतः संकलित करने के लिए, मावेन को उपकरण की आवश्यकता होती है। इसलिए, यह कोर Maven प्लगइन्स का उपयोग करता है (आपके द्वारा एक कोर Maven प्लगइन पहचान इसकी 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>
...
आप मावेन प्रलेखन में मावेन जीवनकाल की शुरूआत में इसके बारे में अधिक जानकारी रख सकते हैं ।
फिर भी, आप इन प्लगइन्स को घोषित कर सकते हैं जब आप उन्हें अन्य मानों के साथ डिफ़ॉल्ट मानों के रूप में कॉन्फ़िगर करना चाहते हैं (उदाहरण के लिए, आपने यह तब किया था जब आपने अपने pom.xml में मावेन-कंपाइलर प्लगइन को JDK संस्करण को समायोजित करने के लिए उपयोग करने के लिए घोषित किया था) और जब आप Maven जीवनचक्र में डिफ़ॉल्ट रूप से उपयोग नहीं किए गए कुछ प्लगइन जोड़ना चाहते हैं।
<maven.compiler.x>
अब से प्रॉपर्टी पर चिपक जाएगा ।