Javen'de java sürümünü belirtme - özellikler ve derleyici eklentisi arasındaki farklar


178

Maaven konusunda çok tecrübeli değilim ve çok modüllü projeyi denerken ebeveyn maven pom'daki tüm çocuk modüllerim için java sürümünü nasıl belirtebileceğimi merak etmeye başladım. Bugüne kadar sadece kullanıyordum:

<properties>
    <java.version>1.8</java.version>
</properties>

Ancak araştırma yaparken, maven derleyici eklentisinde java sürümünü de belirtebileceğinizi buldum:

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

Ve sonra bunu çocuk pomsının kullanımını sağlamak için eklenti yönetim etiketine sarın. Yani ilk soru özellikleri ve maven derleyici eklentisi java sürümü ayarlama arasındaki farklar nelerdir?

Açık bir cevap bulamadım, ancak araştırma sürecinde java sürümünü de bu şekilde belirtebileceğinizi buldum:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

açık beyan olmasam bile derleyici eklentisinin orada olduğunu gösterir. MVN paket çıktılarını

maven-compiler-plugin:3.1:compile (default-compile) @ testproj ---

ve beyan etmediğim diğer bazı eklentiler. Yani bu eklentiler maven pom'un varsayılan, gizli kısmı mı? Özellikler ve maven eklentisi yapılandırma öğesinde kaynak / hedef arasında herhangi bir fark var mı?

Diğer bazı sorular - hangi yolla kullanılmalıdır (ve eşit değilse ne zaman)? Hangisi çok modüllü proje için en iyisidir ve pom'da belirtilen java sürümü JAVA_HOME'da gösterilen sürümden farklıysa ne olur?

Yanıtlar:


289

JDK sürümü nasıl belirlenir?

1) <java.version>Maven belgelerinde referans verilmemiştir.
Bir Spring Boot özgüllüğüdür.
Her ikisi için de java 1.8'i belirtmek için kaynak ve hedef java sürümünü aynı sürümle ayarlamanıza izin verir:

<properties>
     <java.version>1.8</java.version>
</properties>   

Spring Boot kullanıyorsanız onu kullanmaktan çekinmeyin.

2) kullanılarak maven-compiler-pluginya da maven.compiler.source/ maven.compiler.targetözelliklerini belirlemek için sourceve targeteşdeğerdir.

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

ve

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

göre eşdeğer derleyici eklentinin Maven'in belgeleri yana <source>ve <target>özellikleri derleyici yapılandırma Kullanılan elemanlar maven.compiler.sourceve maven.compiler.targettanımlandıkları ise.

kaynak

-sourceJava derleyicisi için argüman.
Varsayılan değer: 1.6.
Kullanıcı özelliktir: maven.compiler.source.

hedef

-targetJava derleyicisi için argüman.
Varsayılan değer: 1.6.
Kullanıcı özelliktir: maven.compiler.target.

Varsayılan değerleri hakkında sourceve targetnot o yana 3.8.0maven derleyici varsayılan değerler elde değişmiş 1.5için1.6 .

3) maven-compiler-plugin 3.6ve sonraki sürümler yeni bir yol sağlar:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>9</release>
    </configuration>
</plugin>

Ayrıca şunları da beyan edebilirsiniz:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

Ancak şu anda, maven-compiler-plugin kullandığınız varsayılan sürüm yeterince yeni bir sürüme bağlı olmadığından çalışmaz.

Maven releaseargümanı releaseşunları sunar: Java 9'dan geçebileceğimiz yeni bir JVM standart seçeneği :

Belirli bir VM sürümü için genel, desteklenen ve belgelenmiş API'lara karşı derler.

Bu şekilde source, targetve bootstrapJVM seçenekleri için aynı sürümü belirtmek için standart bir yol sağlanır .
Belirtmek, bootstrapçapraz derlemeler için iyi bir uygulamadır ve çapraz derlemeler yapmazsanız zarar görmeyecektir.


JDK sürümünü belirtmenin en iyi yolu hangisidir?

İlk yola ( <java.version>) yalnızca Spring Boot kullanıyorsanız izin verilir.

Java 8 ve altı için:

Diğer iki yol hakkında: maven.compiler.source/ maven.compiler.targetözelliklerine değer vermek veya öğesini kullanarak, maven-compiler-pluginbirini veya diğerini kullanabilirsiniz. Sonunda iki çözüm aynı özelliklere ve aynı mekanizmaya bağlı olduğu için gerçeklerde hiçbir şey değişmez: maven çekirdek derleyici eklentisi.

Derleyici eklentisindeki Java sürümlerinden başka özellikler veya davranışlar belirtmeniz gerekmiyorsa, bu şekilde kullanmak daha mantıklı olduğu için daha mantıklıdır:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Java 9'dan:

Bağımsız releasedeğişken (üçüncü nokta), kaynak ve hedef için aynı sürümü kullanmak isteyip istemediğinizi dikkate almanın bir yoludur.

Sürüm JAVA_HOME içindeki JDK ile pom.xml dosyasında belirtilen sürüm arasında farklılık gösterirse ne olur?

Tarafından başvurulan JAVA_HOMEJDK'nın pom'da belirtilen sürümle uyumlu olması sorun değildir , ancak daha iyi bir çapraz derleme uyumluluğu sağlamak için sürümün bootstrapyolunu değer olarak JVM seçeneğini eklemeyi düşünün . rt.jartarget

Dikkate alınması gereken önemli bir nokta da sourceve targetMaven yapılandırmasındaki sürümün JAVA_HOME.
JDK'nın eski bir sürümü, özelliklerini bilmediği için daha yeni bir sürümle derlenemez.

Kullanılan JDK'ya göre kaynak, hedef ve sürüm desteklenen sürümleri hakkında bilgi almak için lütfen java derlemesine bakın : kaynak, hedef ve sürüm desteklenen sürümleri .


JAVA_HOME tarafından başvurulan JDK örneğinin, pom'da belirtilen java hedefi ve / veya kaynak sürümleri ile nasıl uyumlu olmadığı nasıl ele alınır?

Örneğin, JAVA_HOMEbir JDK 1.7'ye atıfta bulunur ve pom.xml'inizin derleyici yapılandırmasında kaynak ve hedef olarak bir JDK 1.8 belirtirseniz, bu bir sorun olacaktır, çünkü açıklandığı gibi JDK 1.7 nasıl derleneceğini bilmiyor .
Kendi bakış açısına göre, bilinmeyen bir JDK sürümüdür.
Bu durumda, Maven derleyici eklentisini JDK'yı şu şekilde belirtecek şekilde yapılandırmalısınız:

<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 derleyici eklentisi ile örneklerde daha fazla ayrıntıya sahip olabilirsiniz .


Sorulmuyor ancak bunun daha karmaşık olabileceği durumlar, kaynağı belirlediğiniz, ancak hedeflemediğiniz zaman. Kaynak sürüme göre hedefte farklı bir sürüm kullanabilir. Kurallar özeldir: Bunlar hakkında Çapraz Derleme Seçenekleri bölümünde okuyabilirsiniz .


Derleyici eklentisi, packagepom.xml dosyasında belirtmeseniz bile Maven hedefinin yürütülmesinde çıkışta izleniyor?

Kodunuzu derlemek ve daha genel olarak maven hedefi için gerekli tüm görevleri yerine getirmek için Maven'in araçlara ihtiyacı vardır. Bu nedenle, gerekli görevleri yapmak için çekirdek Maven eklentilerini kullanır (temel bir Maven eklentisini tanırsınız:) groupId: org.apache.maven.pluginssınıfları derlemek için derleyici eklentisi, testleri yürütmek için test eklentisi vb. Bu eklentileri beyan ettiklerinde, Maven yaşam döngüsünün yürütülmesine bağlılar.
Maven projenizin kök dizininde şu komutu çalıştırabilirsiniz: mvn help:effective-pomson pom'ı etkili bir şekilde kullanmak için. Maven tarafından eklenen eklentileri (pom.xml'nizde belirtilmiş veya edilmemiş), kullanılan sürümle, bunların yapılandırmasıyla ve yaşam döngüsünün her aşaması için yürütülen hedeflerle görebilirsiniz.

mvn help:effective-pomKomutun çıktısında , öğedeki bu çekirdek eklentilerin bildirimini görebilirsiniz, <build><plugins>örneğin:

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

Maven belgelerinde Maven cankurtaranının tanıtımında bu konuda daha fazla bilgi edinebilirsiniz .

Bununla birlikte, bu eklentileri varsayılan değer olarak diğer değerlerle yapılandırmak istediğinizde bildirebilirsiniz (örneğin, JDK sürümünü kullanmak için pom.xml'nizdeki maven-derleyici eklentisini bildirdiğinizde) veya Maven yaşam döngüsünde varsayılan olarak kullanılmayan bazı eklenti yürütmeleri eklemek istiyorum.


Geniş açıklama için teşekkürler, şimdi benim için çok daha açık. Ayrıca hakkında <java.version> - Ben bazı kod snippet bu gördüm, belki bu bazı özel özellik ve yanlış java sürümünü bildirmek için bir yol olduğunu kabul, bundan sonra <maven.compiler.x>özelliğe yapışacaktır .
Plebejusz

Memnuniyetle, hoş geldiniz :) Başlangıçta, bu kadar çok geliştirmek niyetim değildi ama başladığımda durduramadım :) <java.version> için çok muhtemel. Görüşürüz ve iyi maven!
davidxxx

1
" JAVA_HOME'unuzun
JDK'sı pom'daki

2
@Robin A. Meade geri bildiriminiz için teşekkür ederiz. Spring boot kullanıyorum ama bilmiyordum. Şahsen ben kullanılacak veya kullanılacak bir şey olarak başvurulan standart bulunamadı. Bahar önyükleme çok ilginç şeyler sunar, ancak bazı durumlarda özellikleri çok bozulur. Hem kaynak hem de hedef jdk'yi doldurmamak için standart bir maven özelliğinin adını geçersiz kılmak, bir uygulama için tek bir kez gerçekleştirildiği için gerçekten kötü bir fikir olarak görünür. Uygulamanızda basit bir xml satırı yedekleme standardını kaybedersiniz. Vay! Ne bir fikir ...
davidxxx

1
@ MasterJoe2 10 sürümünün resmi javac belgelerinde bulabilirsiniz: docs.oracle.com/javase/10/tools/javac.htm#JSWOR627 . Bu cevabı iki bölüme
ayırdım

3

Yukarıdaki çözümlerin hiçbiri hemen işe yaramadı. Bu yüzden aşağıdakileri yaptım: -

  1. Katma

    <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties>

    pom.xml dosyasında

  2. Gitti Project Properties > Java Build Path , sonra işaret eden JRE Sistem Kütüphanesi kaldırıldı JRE1.5.

  3. Force projeyi güncelledi.


Java 10 ve üstü için hangi sürümü belirtiyorsunuz? 10 veya 1.10 mu?
MasterJoe2

Java 9 ve üstü sürümlerde MasterJoe2 sürüm numarasını olduğu gibi yazmanız gerekir (<sürüm> 10 </version>) ve aşağıdaki sürümler için sürümün önüne 1. eklemeniz gerekir (<sürüm> 1.5 </version>)
ikbel benab

0

Alternatifi düşünün:

<properties>
    <javac.src.version>1.8</javac.src.version>
    <javac.target.version>1.8</javac.target.version>
</properties>

Aynı şey olmalı, maven.compiler.source/maven.compiler.targetancak yukarıdaki çözüm benim için çalışıyor, aksi takdirde ikincisi ebeveyn belirtimini alıyor (.pom bir matrioska var)

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.