Tentukan JDK untuk digunakan Maven


141

Saya mencoba membangun plugin Hudson yang telah saya modifikasi dan membutuhkan jdk1.6. Ini baik-baik saja, tapi saya tidak melihat bagaimana saya bisa memberi tahu pakar di mana jdk berbeda. Saya telah menemukan beberapa sebutan di internet tetapi tampaknya tidak berlaku untuk saya. Beberapa menyarankan menambahkan beberapa konfigurasi .m2/settings.xmltetapi saya tidak punya settings.xml. Plus, saya tidak ingin menggunakan 1,6 untuk semua build maven.

Satu ketegaran yang saya gunakan mvndi cygwin, jika itu penting. Tampaknya saya harus dapat membuat spesifikasi dalam file pom proyek, tetapi pom yang ada cukup telanjang.

Jadi intinya adalah, apakah ada cara untuk menentukan jdk untuk satu doa pakar?

Jawaban:


142

Jadi intinya adalah, apakah ada cara untuk menentukan jdk untuk satu doa pakar?

Ubah sementara nilai JAVA_HOMEvariabel lingkungan Anda .


10
Contoh di windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

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

8
Dan jika ada orang yang lupa dan menghabiskan waktu bertanya-tanya mengapa mereka tidak dapat mengubahnya: JAVA_HOMEdapat diatur untuk Maven (setidaknya di Mac) dalam file ini: /private/etc/mavenrc - Dan itu dapat menggunakan sesuatu seperti (perhatikan backticks bukan tanda kutip tunggal!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(bekerja untuk saya)
Christophe Roussy

2
jika saya mengubah JAVA_HOME dan kemudian saya lakukan java -version, itu masih mencetak versi sebelumnya.
ocramot

82

Tampaknya pakar itu sekarang memberikan solusi di sini: Menyusun Sumber Menggunakan JDK yang Berbeda

Katakanlah JAVA_HOMEpoin Anda ke JDK7 (yang akan menjalankan proses maven)

Anda pom.xmlbisa:

<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>

Jika pengembang Anda hanya menambahkan (dan mengkustomisasi) baris berikut di settings.xmldalamnya, pom Anda akan menjadi platform independen:

<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
Terpilih! Saya menemukan saya dapat menggunakan -Dmaven.compiler.fork=truedan -Dmaven.compiler.executable=/path/to/target/javacdi baris perintah.
Jin Kwon

bahkan menggunakan java-opts itu, Anda masih harus menambahkan ini ke plugin kompilator <executable> $ {maven.compiler.executable} </executable>
Paul Gregoire

2
@JinKwon Passing options dengan -D berfungsi dengan baik, bahkan tanpa mendefinisikannya di bagian plugin kompiler. Ini bagus untuk penggunaan sesekali atau untuk scripting. Anda harus memasukkannya ke dalam jawaban terpisah sehingga kami dapat memilihnya!
Gaëtan Lehmann

Solusi ini gagal ketika saya mencoba menjalankan tes di Java 8 saya mendapatkan * major.minor tidak didukung versi 52.0 *
edwin

39

kompilasi: kompilasi memiliki properti pengguna yang memungkinkan Anda menentukan jalur ke javac.

Perhatikan bahwa properti pengguna ini hanya bekerja ketika forkadalah trueyang falsesecara default.

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

Anda mungkin harus menggandakan kutipan nilainya jika mengandung spasi.

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

Lihat juga prioritas properti kustom Maven .


Saya juga perlu menimpa JAVA_HOMEvariabel saya . Misalnya (dalam 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

Seperti yang Anda katakan "Plus, saya tidak ingin menggunakan 1,6 untuk semua maven build." .... Jadi lebih baik saya akan mengatakan memodifikasi file pom Anda dan menentukan versi jdk yang akan digunakan.

<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>

Ini akan memastikan bahwa proyek khusus Anda menggunakan versi jdk itu.


6
Ini hanyalah titik awal, tetapi bukan solusi. Ini adalah persyaratan untuk plugin kompilasi maven untuk dikompilasi untuk 1.7. Dan kemudian triknya adalah membuat pakar benar-benar mampu mengkompilasi untuk 1.7, yang tidak terlalu sepele jika versi java Anda saat ini berbeda ...
Sergey Ushakov


14

Saya mengatakan Anda mensetup JAVA_HOMEvariabel lingkungan seperti yang dikatakan Pascal: Di Cygwin jika Anda menggunakan bash seperti seharusnya:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Tidak ada salahnya juga menambahkanbin path direktori java ke PATHvariabel lingkungan dengan:

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

Juga tambahkan maven-enforce-pluginuntuk memastikan JDK yang tepat digunakan. Ini adalah praktik yang baik untuk suami Anda.

<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>

Silakan, lihat plugin Maven Enforcer - Penggunaan .


1
Ini sempurna untuk menentukan versi yang tepat dari JDK. Sebagai contoh, saya memiliki proyek yang gagal saat menggunakan JDK 1.8 awal, tetapi jika menggunakan JDK 1.8.0_77, itu berfungsi dengan baik. Saya telah menginstal kedua JDK, dan dengan solusi ini maven mengatakan kepada saya bahwa saya menggunakan versi yang salah dari 1,8 sampai saya mengubah jalur JAVA_HOME saya untuk menargetkan folder 1.8.0_77 tertentu. Jawaban lain tidak memungkinkan Anda untuk begitu terperinci pada versi.
bojingo

13

Saya tahu ini adalah utas lama. Tapi saya mengalami beberapa masalah dengan sesuatu yang mirip dengan ini di Maven untuk Java 8 sumber kompiler. Saya menemukan ini dengan perbaikan cepat yang disebutkan dalam artikel ini saya pikir saya bisa taruh di sini dan mungkin dapat membantu orang lain:

<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
Pembaruan Maven mungkin diperlukan setelah menambahkan baris ini (Eclipse: Klik kanan pada proyek, Maven, Perbarui proyek)
Romano

Mengatur properti maven.compiler tidak mencegah kode dari menggunakan metode yang ditambahkan di java 11. Untuk instance String.repeat (). Ini ketika membangun dengan jdk 11. Jadi pakar membangun tapi saya berharap itu akan gagal
Enrico Giurin

6

Maven menggunakan variabel $ JAVACMD sebagai perintah java terakhir, atur ke tempat eksekusi java akan mengalihkan maven ke JDK yang berbeda.


Terima kasih sobat, setelah menghabiskan 10 jam kami perbaiki dengan bantuan jawaban Anda.
Mukul_3062

3

Hudson juga memungkinkan Anda untuk mendefinisikan beberapa runtime Java, dan membiarkan Anda memanggil Maven dengan salah satunya. Lihat lebih dekat pada halaman konfigurasi.


OP sedang membangun plugin hudson di baris perintah, bukan di bawah hudson (setidaknya, ini adalah pemahaman saya).
Pascal Thivent

3

Jika Anda telah menginstal Java melalui brewdi Macmaka kemungkinan Anda akan menemukan Home Directory Java Anda di sini:

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

Langkah selanjutnya sekarang adalah menemukan Java Homedirektori yang ditunjuk pakar. Untuk menemukannya ketikkan perintah:
mvn -version

masukkan deskripsi gambar di sini

Bidang yang kami minati di sini adalah: Java versiondan runtime.

Maven saat ini sedang menunjuk ke Java 13. Selain itu, Anda dapat melihat path Home Java di bawah runtime kunci, yaitu:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Untuk mengubah versi Java dari pakar, kita perlu menambahkan Java 8path home ke JAVA_HOMEvariabel env.

Untuk melakukan itu kita perlu menjalankan perintah:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home di terminal.

Sekarang jika kita memeriksa versi maven, kita dapat melihat bahwa itu menunjuk ke Java 8 sekarang.

masukkan deskripsi gambar di sini

Masalah dengan ini adalah jika Anda memeriksa versi pakar lagi di terminal baru, Anda akan menemukan bahwa itu menunjuk ke Java 13. Untuk menghindari ini, saya akan menyarankan menambahkan JAVA_HOMEvariabel dalam ~/.profilefile.

Dengan cara ini setiap kali terminal Anda memuatnya akan mengambil nilai yang Anda tetapkan dalam JAVA_HOME secara default. Ini adalah baris yang perlu Anda tambahkan dalam ~/.profilefile:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Anda dapat membuka terminal baru dan memeriksa versi Maven, ( mvn -version) dan Anda akan menemukan itu menunjuk ke Java 8 kali ini.


0

Saya telah membangun masalah dengan pakar dalam Eclipse pada Windows 7.

Meskipun saya amati mvn build berjalan dengan baik dari command line.

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

Eclipse sedang mempertimbangkan JVM sebagai instalasi JRE standar dan bukan JDK sehingga gagal saat dikompilasi.

Saya menambahkan ke eclipse.ini baris berikut:

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

Juga ketika mulai dari gerhana saya digunakan di bagian "Tujuan" daftar berikut:

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

Kesalahan kompilasi diselesaikan.


0

Untuk 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

Namun alternatif lain untuk mengelola beberapa versi jdk adalah jEnv

Setelah instalasi, Anda cukup mengubah versi java "secara lokal" yaitu untuk direktori proyek tertentu dengan:

jenv local 1.6

Ini juga akan membuat mvn menggunakan versi itu secara lokal, ketika Anda mengaktifkan plugin mvn:

jenv enable-plugin maven

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.