उपयोग करने के लिए मावेन के लिए जेडीके निर्दिष्ट करें


141

मैं एक हडसन प्लगइन बनाने की कोशिश कर रहा हूं जिसे मैंने संशोधित किया है और इसके लिए jdk1.6 की आवश्यकता है। यह ठीक है, लेकिन मैं यह नहीं देखता कि मैं मावेन को कैसे बता सकता हूं कि अलग-अलग जेडके कहां है। मैं इंटरनेट पर कुछ उल्लेख पाया है, लेकिन वे मुझे करने के लिए लागू नहीं लगते हैं। कुछ का सुझाव है कि कुछ विन्यास जोड़ने के लिए, .m2/settings.xmlलेकिन मेरे पास नहीं है settings.xml। इसके अलावा, मैं सभी मावेन बिल्ड के लिए 1.6 का उपयोग नहीं करना चाहता।

एक किंक मैं mvnसाइबरविन में उपयोग कर रहा हूं , अगर यह बिल्कुल भी मायने रखता है। ऐसा प्रतीत होता है कि मुझे प्रोजेक्ट pom फ़ाइल में विनिर्देश बनाने में सक्षम होना चाहिए, लेकिन मौजूदा पोम बहुत नंगे है।

तो नीचे की रेखा है, क्या मावेन के एकल आह्वान के लिए एक jdk निर्दिष्ट करने का एक तरीका है?

जवाबों:


142

तो नीचे की रेखा है, क्या मावेन के एकल आह्वान के लिए एक jdk निर्दिष्ट करने का एक तरीका है?

अस्थायी रूप से अपने JAVA_HOMEपर्यावरण चर का मान बदलें ।


10
खिड़कियों में उदाहरण:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
लुबंटू में: JAVA_HOME = "/ घर / देसा / कार्यक्रम / jdks / jdk1.6.0_45 /" mvn -v
एनरिक सैन

8
और अगर कोई और भूल जाता है और यह सोचकर उम्र बिताता है कि वे इसे क्यों नहीं बदल JAVA_HOMEसकते हैं: इस फाइल में मावेन (मैक पर कम से कम) के लिए सेट किया जा सकता है: /private/etc/mavenrc - और वह कुछ इस तरह का उपयोग कर सकता है (नोट सिंगल बिट्स नहीं!)।export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
यूनिक्स: export JAVA_HOME='D:/dev/java/jdk8/jre'(मेरे लिए काम करता है)
क्रिस्टोफ रूसो

2
अगर मैं JAVA_HOME बदलता हूं और फिर करता हूं java -version, तो यह अभी भी पिछले संस्करण को प्रिंट करता है।
१४:१५ बजे १४:१

82

लगता है कि मावेन अब यहां एक समाधान देता है: एक अलग जेडडीके का उपयोग कर सूत्रों का संकलन

आइए JAVA_HOMEJDK7 से अपनी बात कहें (जो मावेन प्रक्रियाओं को चलाएगा)

आपका pom.xmlहो सकता है:

<build>
    <plugins>
        <!-- we want JDK 1.6 source and binary compatiblility -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- ... -->
        <!-- we want sources to be processed by a specific 1.6 javac -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <verbose>true</verbose>
              <fork>true</fork>
              <executable>${JAVA_1_6_HOME}/bin/javac</executable>
              <compilerVersion>1.3</compilerVersion>
            </configuration>
        </plugin>
    </plugins>
</build>

यदि आपके डेवलपर अपने में निम्नलिखित लाइनें जोड़ते हैं (और अनुकूलित करते हैं) settings.xml, तो आपका पोम प्लेटफॉर्म इंडिपेंडेंट होगा:

<settings>
  [...]
  <profiles>
    [...]
    <profile>
      <id>compiler</id>
        <properties>
          <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
          <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
        </properties>
    </profile>
  </profiles>
  [...]
  <activeProfiles>
    <activeProfile>compiler</activeProfile>
  </activeProfiles>
</settings>

18
वोट दिया! मैंने पाया कि मैं उपयोग कर सकता हूं -Dmaven.compiler.fork=trueऔर -Dmaven.compiler.executable=/path/to/target/javacकमांड लाइन में।
जिन क्वाँ

यहां तक ​​कि उन जावा-ऑप्स का उपयोग करते हुए, आपको इसे अभी भी संकलक प्लगइन में जोड़ना होगा <एक्जीक्यूटेबल> $ {maven.compiler.executable} </ निष्पादन योग्य>
पॉल

2
-JinKwon -D के साथ पासिंग विकल्प ठीक काम करता है, यहां तक ​​कि कंपाइलर प्लगइन सेक्शन में इसे परिभाषित किए बिना। यह सामयिक उपयोग के लिए या पटकथा के लिए अच्छा है। आपको इसे एक अलग उत्तर में रखना चाहिए ताकि हम इसे वोट कर सकें!
गाएटन लेहमन

जब मैं जावा 8 में परीक्षण चलाने की कोशिश कर रहा था तब यह समाधान विफल हो गया था। मैं असमर्थित था। प्रमुख संस्करण 52.0 *
edwin

39

संकलन: संकलन में एक उपयोगकर्ता गुण होता है जो आपको एक पथ निर्दिष्ट करने की अनुमति देता है javac

ध्यान दें कि यह उपयोगकर्ता संपत्ति केवल तभी काम करती forkहै trueजो falseडिफ़ॉल्ट रूप से होती है।

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile

यदि इसमें रिक्त स्थान हैं, तो आपको मूल्य को दोगुना करना पड़ सकता है।

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile

मावेन कस्टम गुण मिसाल भी देखें ।


मुझे अपने JAVA_HOMEचर को अधिलेखित करने की भी आवश्यकता है । उदाहरण के लिए (बैश शेल में):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
एनरिक एस। फिलाइज

24

जैसा कि यू ने कहा "प्लस, मैं सभी मावेन बिल्ड के लिए 1.6 का उपयोग नहीं करना चाहता।" .... इसलिए बेहतर होगा कि मैं आपकी पोम फ़ाइल को संशोधित करूं और जो jdk संस्करण का उपयोग करने के लिए निर्दिष्ट करें।

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.9</source>
                <target>1.9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

यह सुनिश्चित करेगा कि आपका विशेष प्रोजेक्ट jdk के उस संस्करण का उपयोग करता है।


6
यह सिर्फ शुरुआती बिंदु है, लेकिन समाधान नहीं। यह 1.7 के लिए संकलन करने के लिए मावेन कंपाइलर प्लगइन की आवश्यकता है। और फिर चाल 1.7 के लिए संकलन करने के लिए वास्तव में सक्षम मावेन बनाने के लिए है, जो कि इतना तुच्छ नहीं है अगर आपका वर्तमान जावा संस्करण अलग है ...
सर्गेई उशाकोव


14

मैं कहता हूं कि आप JAVA_HOMEपर्यावरण वैरिएबल को सेटअप करते हैं जैसे पास्कल कह रहा है: साइगविन में यदि आप अपने शेल के रूप में बैश का उपयोग करते हैं:

export JAVA_HOME=/cygdrive/c/pathtothejdk

यह कभी भी पर्यावरण चर के लिए जावा निर्देशिका पथ को प्रस्तुत करने के लिए परेशान नहीं करता है :binPATH

export PATH=${JAVA_HOME}/bin:${PATH}

यह भी maven-enforce-pluginसुनिश्चित करने के लिए जोड़ें कि सही JDK का उपयोग किया जाता है। यह आपके पोम के लिए एक अच्छा अभ्यास है।

<build>
 <plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <executions>
        <execution>
          <id>enforce-versions</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <requireJavaVersion>
                <version>1.6</version>
              </requireJavaVersion>
            </rules>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

कृपया, Maven Enforcer प्लगइन देखें - उपयोग


1
यह जेडीके के सटीक संस्करण को निर्दिष्ट करने के लिए एकदम सही था । उदाहरण के लिए, मेरे पास एक प्रोजेक्ट है जो प्रारंभिक JDK 1.8 का उपयोग करते समय विफल रहता है, लेकिन यदि JDK 1.8.0_77 का उपयोग किया जाता है, तो यह ठीक काम करता है। मेरे पास दोनों JDK स्थापित थे, और इस समाधान के साथ maven ने मुझे बताया कि मैं 1.8 के गलत संस्करण का उपयोग कर रहा था जब तक कि मैंने विशिष्ट 1.8.0_77 फ़ोल्डर को लक्षित करने के लिए अपने JAVA_HOME पथ को बदल नहीं दिया। अन्य उत्तरों ने आपको संस्करण पर इतना बारीक नहीं होने दिया।
बिंगो

13

मैं इसका एक पुराना सूत्र जानता हूं। लेकिन मैं जावा 8 संकलक स्रोत के लिए मावेन में इसी तरह के कुछ मुद्दों के साथ कुछ कर रहा था। मुझे लगा कि इस लेख में बताए गए एक त्वरित सुधार के साथ मैंने सोचा कि मैं इसे यहां रख सकता हूं और शायद दूसरों की मदद कर सकता हूं:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

1
इन लाइनों को जोड़ने के बाद एक मावेन अपडेट की आवश्यकता हो सकती है (ग्रहण: प्रोजेक्ट पर राइट क्लिक करें, मावेन, अपडेट प्रोजेक्ट)
रोमनो

Maven.compiler गुण सेट करना जावा 11 में जोड़े गए तरीकों का उपयोग करने से कोड को रोकता नहीं है। उदाहरण के लिए String.repeat ()। जब यह 11 jdk के साथ बन रहा है। तो
मावेन

6

मावेन अंतिम जावा कमांड के रूप में चर $ JAVACMD का उपयोग करता है, इसे उस जगह पर सेट करता है जहां जावा निष्पादन योग्य है, मावेन को अलग-अलग JDK पर स्विच करेगा।


धन्यवाद दोस्त, 10 घंटे बिताने के बाद हमने आपके उत्तर की मदद से तय किया।
मुकुल_3062

3

हडसन आपको कई जावा रनटाइम को परिभाषित करने की भी अनुमति देता है, और आपको इनमें से एक के साथ मावेन को आमंत्रित करना है। कॉन्फ़िगरेशन पृष्ठ पर एक करीब देखो।


ओपी कमांड लाइन पर एक हडसन प्लगइन बना रहा है, हडसन के तहत नहीं (कम से कम, यह मेरी समझ है)।
पास्कल थिवेंट

3

यदि आपने जावा को इसके माध्यम से स्थापित brewकिया है Macतो संभावना है कि आप अपने जावा होम डायरेक्टरी को यहां पाएंगे:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

अब अगला कदम यह होगा कि कौन सी Java Homeडायरेक्टरी मावेन की ओर इशारा करती है। इसे कमांड में टाइप करने के लिए:
mvn -version

यहां छवि विवरण दर्ज करें

हमारे यहां जिन क्षेत्रों में रुचि है, वे हैं: Java versionऔर runtime

मावेन फिलहाल इशारा कर रहे हैं Java 13। इसके अलावा, आप मुख्य रनटाइम के तहत जावा होम पथ देख सकते हैं, जो है:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

मावेन के जावा संस्करण को बदलने के लिए, हमें एनवी चर के Java 8लिए होम पथ को जोड़ना होगा JAVA_HOME

ऐसा करने के लिए हमें कमांड चलाने की जरूरत है:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home टर्मिनल में।

अब अगर हम मावेन संस्करण की जांच करते हैं, तो हम देख सकते हैं कि यह जावा 8 को इंगित कर रहा है।

यहां छवि विवरण दर्ज करें

इसके साथ समस्या यह है कि यदि आप नए टर्मिनल में फिर से मावेन संस्करण की जांच करते हैं, तो आप पाएंगे कि यह जावा 13. की ​​ओर इशारा कर रहा है। इससे बचने के लिए मैं फ़ाइल JAVA_HOMEमें चर जोड़ने का सुझाव दूंगा ~/.profile

इस तरह जब भी आपका टर्मिनल लोड हो रहा है, तो वह डिफ़ॉल्ट रूप से JAVA_HOME में आपके द्वारा परिभाषित मूल्य को ले जाएगा। यह वह पंक्ति है जिसे आपको ~/.profileफ़ाइल में जोड़ने की आवश्यकता है :
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

आप एक नया टर्मिनल खोल सकते हैं और मावेन संस्करण की जांच कर सकते हैं, ( mvn -version) और आप पाएंगे कि यह इस बार जावा 8 की ओर इशारा कर रहा है।


0

मैंने विंडोज 7 पर ग्रहण के भीतर मावेन के साथ समस्या का निर्माण किया था।

हालांकि मैंने देखा कि mvan बिल्ड कमांड लाइन से ठीक चल रहा था।

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml   > output.log

ग्रहण JDK के बजाय डिफ़ॉल्ट JVM JRE इंस्टॉलेशन के रूप में विचार कर रहा था, इसलिए यह संकलन पर विफल हो रहा था।

मैंने eclipse.ini को निम्नलिखित पंक्ति में जोड़ा:

-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin

इसके अलावा जब ग्रहण से शुरू हुआ तो मैंने सूची के बाद "लक्ष्य" अनुभाग में उपयोग किया:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml

संकलन त्रुटि हल हो गई।


0

जावा 9 के लिए:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

0

कई jdk संस्करणों को प्रबंधित करने के लिए एक और विकल्प jEnv है

स्थापना के बाद, आप केवल "स्थानीय स्तर पर" अर्थात विशिष्ट परियोजना निर्देशिका के लिए जावा संस्करण बदल सकते हैं:

jenv local 1.6

जब आप mvn प्लगइन को सक्षम करते हैं तो यह स्थानीय रूप से उस संस्करण का उपयोग करेगा।

jenv enable-plugin maven

0

आप अपने होम डायरेक्टरी में मावेन के लिए JDK को एक फ़ाइल में सेट कर सकते हैं ~/.mavenrc:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

इस पर्यावरण चर को mvan स्क्रिप्ट द्वारा जांचा जाएगा और जब उपयोग किया जाएगा:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.