Maven'in kullanması için JDK belirtme


141

Değiştirdiğim bir Hudson eklentisi oluşturmaya çalışıyorum ve jdk1.6 gerektirir. Bu iyi, ama maven'e farklı jdk'nin nerede olduğunu nasıl anlatabileceğimi göremiyorum. İnternette birkaç söz buldum ama onlar bana başvurmuyor gibi görünüyor. Bazıları bazı yapılandırma eklemenizi önerir, .m2/settings.xmlancak a settings.xml. Ayrıca, tüm maven yapıları için 1.6 kullanmak istemiyorum.

Bir sapma mvn, eğer önemli olursa, cygwin'de kullanıyorum . Görünüşe göre proje pom dosyasında şartname yapabilmeliyim, ancak mevcut pom oldukça çıplak.

Yani alt satırda, maven'in tek bir çağrılması için bir jdk belirtmenin bir yolu var mı?

Yanıtlar:


142

Yani alt satırda, maven'in tek bir çağrılması için bir jdk belirtmenin bir yolu var mı?

JAVA_HOMEOrtam değişkeninizin değerini geçici olarak değiştirin .


10
Pencerelerde örnek:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
in Lubuntu: JAVA_HOME = "/ ev / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín

8
Ve başka birisinin neden değiştiremediğini merak ederek yaşları unutması ve harcaması durumunda: JAVA_HOMEMaven (en azından Mac'te) için bu dosyada /private/etc/mavenrc ayarlanabilir : - Ve bu gibi bir şey kullanabilir (backticks tek tırnak değil!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(benim için çalışıyor)
Christophe Roussy

2
JAVA_HOME'u değiştirir ve sonra yaparsam java -version, önceki sürümü yazdırmaya devam eder.
19:50

82

Bu maven şimdi burada bir çözüm sunuyor gibi görünüyor: Farklı bir JDK kullanarak kaynakları derleme

Diyelim ki JAVA_HOMEJDK7'ye (maven süreçlerini çalıştıracak)

Şunlarınız pom.xmlolabilir:

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

Geliştiricileriniz aşağıdaki satırları ekliyorsa (ve özelleştiriyorsa), settings.xmlpom'unuz platformdan bağımsız olacaktır:

<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
Oy verildi! Ben kullanabilir buldum -Dmaven.compiler.fork=trueve -Dmaven.compiler.executable=/path/to/target/javackomut satırında.
Jin Kwon

bu java-op'leri kullanarak bile, bunu <executable> $ {maven.compiler.executable} </executable> derleyici eklentisine hala eklemelisiniz
Paul Gregoire

2
@JinKwon -D ile geçiş seçenekleri derleyici eklentisi bölümünde tanımlanmadan bile iyi çalışır. Bu, ara sıra kullanım veya komut dosyaları için güzeldir. Oy verebilmemiz için ayrı bir cevap vermelisiniz!
Gaëtan Lehmann

Java 8'de testler yapmaya çalıştığımda bu çözüm başarısız oldu * Desteklenmiyor major.minor sürüm 52.0 *
edwin

39

derlemek: derleme sahip bir kullanıcı mülkü size bir yol belirlemenizi sağlar javac.

Bu kullanıcı özelliği yalnızca çalıştığını unutmayın forkolduğunu truehangi falsevarsayılan olarak.

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

Boşluk içeriyorsa değeri iki kez alıntı yapmanız gerekebilir.

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

Ayrıca bkz. Maven özel özellik önceliği .


Ayrıca JAVA_HOMEdeğişkenimin üzerine yazmam gerekiyordu . Örneğin (bash kabuğunda):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

Dediğim gibi "Artı, ben tüm maven yapıları için 1.6 kullanmak istemiyorum." Çok daha iyi ben pom dosyanızı değiştirmek ve kullanmak için hangi jdk sürümünü belirtmek söyleyeceğim.

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

Özel projenizin jdk'nin bu sürümünü kullanmasını sağlayacaktır.


6
Bu sadece başlangıç ​​noktası, ama çözüm değil. Bu, maven derleyici eklentisinin 1.7 için derlenmesi gereksinimidir. Ve sonra hile, maven'i 1.7 için derleme yeteneğine sahip hale getirmektir, bu da mevcut java sürümünüz farklıysa çok önemsiz değildir ...
Sergey Ushakov


14

Ben kurulum söylemek JAVA_HOMEIn Cygwin kabuk olması gerektiği gibi Eğer bash kullanıyorsanız: Pascal gibi ortam değişkeni söylüyor:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Ortam değişkenine java dizini yolunu aşağıdakilerle eklemek asla zarar vermez :binPATH

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

Ayrıca maven-enforce-plugindoğru JDK'nın kullanıldığından emin olmak için ekleyin . Bu pom için iyi bir uygulamadır.

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

Lütfen bkz. Maven Enforcer eklentisi - Kullanım .


1
Bu, JDK'nın tam sürümünü belirtmek için mükemmeldi . Örneğin, ilk JDK 1.8'i kullanırken başarısız olan bir projem var, ancak JDK 1.8.0_77 kullanılıyorsa, gayet iyi çalışıyor. Her iki JDK'yı da yükledim ve bu çözümle maven, JAVA_HOME yolumu belirli 1.8.0_77 klasörünü hedeflemek için değiştirene kadar 1.8'in yanlış sürümünü kullandığımı söyledi. Diğer cevaplar sürümde çok ayrıntılı olmanıza izin vermedi.
Mart'ta bojingo

13

Eski bir konu olduğunu biliyorum. Ancak Java 8 derleyici kaynağında Maven'de buna benzer bir şeyle ilgili bazı sorunlar yaşıyordum. Bunu , buraya koyabileceğimi ve belki de başkalarına yardımcı olabileceğini düşündüğüm bu makalede bahsedilen hızlı bir düzeltme ile anladım :

<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
Bu satırları ekledikten sonra bir Maven Güncellemesi gerekebilir (Tutulma: Projeye sağ tıklayın, Maven, Güncelleme projesi)
Romano

Maven.compiler özelliklerinin ayarlanması, kodun java 11'e eklenen yöntemleri kullanmasını engellemez. For String.repeat () örnekleri için. Bu jdk 11 ile inşa ederken. Yani maven inşa eder ama keşke başarısız olur
Enrico Giurin

6

Maven, son java komutu olarak $ JAVACMD değişkenini kullanır, java yürütülebilir dosyasının olduğu yere ayarlayın, maven'i farklı JDK'ya geçirir.


Teşekkürler dostum, 10 saat geçirdikten sonra cevabınızın yardımıyla düzelttik.
Mukul_3062

3

Hudson ayrıca birkaç Java çalışma zamanı tanımlamanıza ve Maven'i bunlardan biriyle çağırmanıza izin verir. Yapılandırma sayfasına yakından bakın.


OP, hudson altında değil, komut satırında bir hudson eklentisi oluşturuyor (en azından bu benim anlayışım).
Pascal Thivent

3

Eğer aracılığıyla Java yüklediyseniz brewiçinde Macsonra şansını burada Java başlangıç dizini bulacaksınız şunlardır:

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

Bir sonraki adım Java Home, maven'in hangi dizine işaret ettiğini bulmak olacaktır. Bulmak için komutu yazın:
mvn -version

resim açıklamasını buraya girin

Burada ilgilendiğimiz alanlar: Java versionve runtime.

Maven şu anda işaret ediyor Java 13 . Ayrıca, Java Home yolunu anahtar çalışma zamanının altında görebilirsiniz, yani:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Maaven'in Java sürümünü değiştirmek için Java 8ev yolunu JAVA_HOMEenv değişkenine eklememiz gerekir .

Bunu yapmak için şu komutu çalıştırmalıyız:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home terminalde.

Eğer maven sürümünü kontrol edersek, şimdi Java 8'i işaret ettiğini görebiliriz.

resim açıklamasını buraya girin

Bu sorun, yeni sürümünde maven sürümünü tekrar kontrol ederseniz, Java 13'ü işaret ettiğini göreceksiniz. Bunu önlemek için JAVA_HOMEdeğişkene ~/.profiledosya eklemenizi öneririm .

Bu şekilde terminaliniz her yüklendiğinde, varsayılan olarak JAVA_HOME içinde tanımladığınız değeri alacaktır. Bu, eklemeniz gereken satırdır.~/.profile dosyaya :
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Yeni bir terminal açabilir ve Maven sürümünü kontrol edebilirsiniz ( mvn -version) ve bu sefer Java 8'i işaret ettiğini göreceksiniz.


0

Windows 7'de Eclipse içinde maven ile ilgili sorun yaşadım.

Mvn derlemesinin komut satırından iyi çalıştığını gözlemlememe rağmen.

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

Eclipse, varsayılan JVM'yi JDK yerine bir JRE yüklemesi olarak kabul ediyordu, bu yüzden derlemede başarısız oldu.

Eclipse.ini dosyasına aşağıdaki satırı ekledim:

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

Ayrıca tutulmadan başlayarak aşağıdaki listede "Hedefler" bölümünde kullandım:

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

Derleme hatası çözüldü.


0

Java 9 için:

<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

Birden fazla jdk sürümünü yönetmek için başka bir alternatif jEnv

Kurulumdan sonra, java sürümünü "yerel olarak" yani belirli bir proje dizini için şu şekilde değiştirebilirsiniz:

jenv local 1.6

Bu, mvn eklentisini etkinleştirdiğinizde mvn'nin bu sürümü yerel olarak kullanmasını sağlar:

jenv enable-plugin maven

0

Maven için JDK'yı ana dizininizdeki bir dosyada da ayarlayabilirsiniz ~/.mavenrc:

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

Bu ortam değişkeni mvn betiği tarafından kontrol edilecek ve mevcut olduğunda kullanılacaktır:

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.