ระบุ JDK สำหรับ Maven ที่จะใช้


141

ฉันกำลังพยายามสร้างปลั๊กอินฮัดสันที่ฉันแก้ไขและต้องใช้ jdk1.6 นี่เป็นเรื่องปกติ แต่ฉันไม่เห็นว่าฉันจะบอกพวกเขาได้อย่างไรว่า jdk แตกต่างกันอย่างไร ฉันพบบางอย่างที่กล่าวถึงบนอินเทอร์เน็ต แต่พวกเขาดูเหมือนจะไม่ใช้กับฉัน บางคนแนะนำให้เพิ่มการตั้งค่าบางอย่างแต่ฉันไม่ได้มี.m2/settings.xml settings.xmlนอกจากนี้ฉันไม่ต้องการใช้ 1.6 สำหรับการสร้าง maven ทั้งหมด

ผมหงอกหนึ่งที่ใช้mvnใน cygwin ถ้าเรื่องที่ทุกคน ดูเหมือนว่าฉันควรจะสามารถทำข้อกำหนดในไฟล์ pom โครงการ แต่ pom ที่มีอยู่เปลือยสวย

ดังนั้นกำไรคือมีวิธีระบุ jdk สำหรับการร้องขอ maven เดียวหรือไม่?

คำตอบ:


142

ดังนั้นกำไรคือมีวิธีระบุ jdk สำหรับการร้องขอ maven เดียวหรือไม่?

เปลี่ยนค่าของJAVA_HOMEตัวแปรสภาพแวดล้อมของคุณชั่วคราว


10
ตัวอย่างใน windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
ใน lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín

8
และในกรณีที่คนอื่นลืมและใช้เวลาอายุสงสัยว่าทำไมพวกเขาไม่สามารถเปลี่ยนมัน: JAVA_HOMEสามารถตั้งค่าสำหรับ Maven (บน Mac อย่างน้อย) ในไฟล์นี้: /private/etc/mavenrc - และที่สามารถใช้สิ่งที่ต้องการ (หมายเหตุ backticks ไม่ใช่คำพูดเดียว!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(ใช้ได้กับฉัน)
Christophe Roussy

2
ถ้าฉันเปลี่ยน JAVA_HOME แล้วฉันjava -versionก็ยังคงพิมพ์รุ่นก่อนหน้า
ocramot

82

ดูเหมือนว่าตอนนี้ maven จะให้ทางออกที่นี่: รวบรวมแหล่งข้อมูลโดยใช้ JDK ที่แตกต่างกัน

สมมติว่าJAVA_HOMEคะแนนของคุณเป็น JDK7 (ซึ่งจะเรียกใช้กระบวนการ maven)

คุณ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.xmlpom ของคุณจะเป็นแพลตฟอร์มอิสระ:

<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ในบรรทัดคำสั่ง
Jin Kwon

แม้จะใช้ java-opts เหล่านั้นคุณยังคงต้องเพิ่มสิ่งนี้ลงในปลั๊กอินคอมไพเลอร์ <executable> $ {maven.compiler.executable} </executable>
Paul Gregoire

2
@JinKwon ตัวเลือก Passing ด้วย -D ทำงานได้ดีแม้จะไม่ได้กำหนดไว้ในส่วนปลั๊กอินคอมไพเลอร์ นี่เป็นสิ่งที่ดีสำหรับการใช้งานเป็นครั้งคราวหรือสำหรับการเขียนสคริปต์ คุณควรใส่ไว้ในคำตอบแยกต่างหากเพื่อให้เราสามารถโหวตได้!
Gaëtan Lehmann

วิธีนี้ล้มเหลวเมื่อฉันพยายามเรียกใช้การทดสอบใน Java 8 ฉันได้รับ * ไม่สนับสนุน major.minor รุ่น 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

ดูเพิ่มเติมMaven คุณสมบัติแบบกำหนดเองมีความสำคัญ


ฉันต้องเขียนทับJAVA_HOMEตัวแปรของฉันด้วย ตัวอย่างเช่น (ใน bash shell):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
Enrique S. Filiage

24

อย่างที่คุณพูดว่า "Plus, ฉันไม่ต้องการใช้ 1.6 สำหรับ maven builds ทั้งหมด" .... ดีกว่าฉันจะพูดว่าแก้ไขไฟล์ pom ของคุณแล้วระบุ jdk version ที่จะใช้

<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
นี่เป็นเพียงจุดเริ่มต้น แต่ไม่ใช่วิธีแก้ปัญหา นี่เป็นข้อกำหนดสำหรับปลั๊กอิน maven compiler ที่จะคอมไพล์เป็น 1.7 และเคล็ดลับก็คือการทำให้ Maven สามารถรวบรวม 1.7 ได้จริง ๆ ซึ่งไม่น่าสนใจนักหากจาวาเวอร์ชันปัจจุบันของคุณแตกต่างออกไป ...
Sergey Ushakov

นั่นคือคำถามอื่น ๆstackoverflow.com/questions/16723533/ …
พอลเวสต์

14

ฉันว่าคุณตั้งค่าJAVA_HOMEตัวแปรสภาพแวดล้อมเช่น Pascal พูดว่า: ใน Cygwin ถ้าคุณใช้ทุบตีเป็นเปลือกของคุณควรจะ:

export JAVA_HOME=/cygdrive/c/pathtothejdk

ไม่เป็นอันตรายต่อการผนวกbinพา ธ ไดเร็กทอรีJava ไปยังPATHตัวแปรสภาวะแวดล้อมด้วย:

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 ตัวอย่างเช่นฉันมีโครงการที่ล้มเหลวเมื่อใช้ JDK 1.8 เริ่มต้น แต่ถ้าใช้ JDK 1.8.0_77 มันก็ใช้ได้ดี ฉันติดตั้ง JDK ทั้งสองเครื่องและด้วยวิธีการแก้ปัญหานี้ maven บอกฉันว่าฉันใช้รุ่น 1.8 ผิดจนกระทั่งฉันเปลี่ยนเส้นทาง JAVA_HOME เพื่อกำหนดเป้าหมายโฟลเดอร์ 1.8.0_77 เฉพาะ คำตอบอื่น ๆ ไม่อนุญาตให้คุณละเอียดมากในรุ่น
bojingo

13

ฉันรู้ว่ามันเป็นด้ายเก่า แต่ฉันมีปัญหาบางอย่างกับสิ่งที่คล้ายกันนี้ในแหล่งรวบรวมคอมไพเลอร์ Maven for Java 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 หลังจากเพิ่มบรรทัดเหล่านี้ (Eclipse: คลิกขวาที่โครงการ Maven, อัปเดตโครงการ)
Romano

การตั้งค่าคุณสมบัติ maven.compiler ไม่ได้ป้องกันโค้ดจากการใช้วิธีการที่เพิ่มใน java 11 สำหรับอินสแตนซ์ String.repeat () สิ่งนี้เมื่อสร้างด้วย jdk 11. maven สร้างขึ้น แต่ฉันหวังว่ามันจะล้มเหลว
Enrico Giurin

6

Maven ใช้ตัวแปร $ JAVACMD เป็นคำสั่ง java ขั้นสุดท้ายตั้งค่าเป็นตำแหน่งที่โปรแกรมเรียกทำงานจาวาจะเปลี่ยน maven ไปเป็น JDK อื่น


ขอบคุณเพื่อนหลังจากใช้เวลา 10 ชั่วโมงเราแก้ไขด้วยความช่วยเหลือของคำตอบของคุณ
Mukul_3062

3

ฮัดสันยังอนุญาตให้คุณกำหนด Java หลายรอบและอนุญาตให้คุณเรียกใช้ Maven ด้วยหนึ่งในนั้น ดูอย่างละเอียดในหน้าการกำหนดค่า


OP กำลังสร้างปลั๊กอินฮัดสันบนบรรทัดคำสั่งไม่ใช่ภายใต้ฮัดสัน (อย่างน้อยนี่คือความเข้าใจของฉัน)
Pascal Thivent

3

หากคุณติดตั้ง Java ผ่านbrewในMacแล้วโอกาสที่คุณจะได้พบ Java ไดเรกทอรีบ้านของคุณที่นี่:

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

ขั้นตอนต่อไปในตอนนี้คือการค้นหาว่าJava Homeไดเรกทอรี maven นั้นชี้ไปที่ใด ในการค้นหามันพิมพ์ในคำสั่ง:
mvn -version

ป้อนคำอธิบายรูปภาพที่นี่

สาขาที่เรามีความสนใจในที่นี่คือ และJava versionruntime

Maven Java 13ขณะนี้ชี้ไปที่ นอกจากนี้คุณยังสามารถเห็นเส้นทาง Java Home ภายใต้คีย์รันไทม์ซึ่งก็คือ:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

ในการเปลี่ยนรุ่น Java ของ Maven เราจำเป็นต้องเพิ่มJava 8เส้นทางบ้านกับJAVA_HOMEตัวแปร env

ในการทำเช่นนั้นเราจำเป็นต้องเรียกใช้คำสั่ง:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home ในเทอร์มินัล

ตอนนี้ถ้าเราตรวจสอบเวอร์ชั่น maven เราจะเห็นว่ามันชี้ไปที่ Java 8 ทันที

ป้อนคำอธิบายรูปภาพที่นี่

ปัญหานี้คือถ้าคุณตรวจสอบเวอร์ชัน maven อีกครั้งในเทอร์มินัลใหม่คุณจะพบว่ามันชี้ไปที่ Java 13 เพื่อหลีกเลี่ยงปัญหานี้ฉันขอแนะนำให้เพิ่มJAVA_HOMEตัวแปรใน~/.profileไฟล์

วิธีนี้เมื่อใดก็ตามที่เทอร์มินัลของคุณกำลังโหลดจะใช้ค่าที่คุณกำหนดใน JAVA_HOME เป็นค่าเริ่มต้น นี่คือบรรทัดที่คุณต้องเพิ่มใน~/.profileไฟล์:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

คุณสามารถเปิดเทอร์มินัลใหม่และตรวจสอบเวอร์ชัน Maven ( mvn -version) และคุณจะพบว่ามันกำลังชี้ไปที่ Java 8 ในครั้งนี้


0

ฉันสร้างปัญหากับ maven ภายใน Eclipse บน Windows 7

แม้ว่าฉันสังเกตว่าการสร้าง mvn นั้นทำงานได้ดีจากบรรทัดคำสั่ง

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

Eclipse กำลังพิจารณาว่าเป็น JVM เริ่มต้นเป็นการติดตั้ง JRE แทนที่จะเป็น JDK ดังนั้นจึงล้มเหลวในการรวบรวม

ฉันเพิ่ม eclipse.ini ในบรรทัดต่อไปนี้:

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

นอกจากนี้เมื่อเริ่มต้นจาก eclipse ฉันใช้ในส่วน "เป้าหมาย" รายการต่อไปนี้:

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

ข้อผิดพลาดในการรวบรวมได้รับการแก้ไข


0

สำหรับ Java 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 ใช้เวอร์ชันนั้นแบบโลคัลเมื่อคุณเปิดใช้งานปลั๊กอิน mvn:

jenv enable-plugin maven

0

คุณสามารถตั้งค่า JDK สำหรับ Maven ในไฟล์ในโฮมไดเร็กตอรี่ของคุณ~/.mavenrc:

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

ตัวแปรสภาวะแวดล้อมนี้จะถูกตรวจสอบโดยสคริปต์ mvn และใช้เมื่อมีอยู่:

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.