Bir pom.xml dosyasında Java derleyici sürümünü nasıl belirtirsiniz?


252

Netbeans üzerine yaklaşık 2000'den fazla satırı olan bir maven kodu yazdım. Netbeans üzerinde derlemek, her şey yolunda, ama komut satırında çalıştırmak istiyorsanız, bu hataları alırsınız:

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        HashSet<Double> resid_List = new HashSet<Double>(Arrays.asList(resid_val));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        List<Integer> ind_ovlpList = new ArrayList<Integer>(Arrays.asList(ind_ovlp));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
public class ColumnComparator implements Comparator<double[]> {

annotations are not supported in -source 1.3
(use -source 5 or higher to enable annotations)
@Override

Java 1.3.1, derleyici hatalarını kullanmaya çalıştım , ancak daha fazla hata aldım. Diğer yazılardan pom.xml'i değiştirmem gerektiğini buldum, ancak nasıl yapacağımı bilmiyorum. İşte benim pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany</groupId>
  <artifactId>mavenmain</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mavenmain</name>
    <url>http://maven.apache.org</url>

   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

   <dependencies>
     <dependency>
       <groupId>junit</groupId>
        <artifactId>junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
     <dependency>
        <groupId>gov.nist.math</groupId>
        <artifactId>jama</artifactId>
        <version>1.0.2</version>
     </dependency>
   </dependencies>
 </project>

Bana yardım edebilirsen harika olur.


2
Java sürümünü yükseltme zamanı.
Sotirios Delimanolis

5
Jenerikler Java 5'den desteklenmektedir. Bu Java sürümünden önce çalışmasını sağlamak imkansızdır.
Luiggi Mendoza

OpenJDK javac için varsayılan 1.3, Oracle JDK için 1.5
Thorbjørn Ravn Andersen

Her ikisi de bir programcı olmamdan önce!
CorayThan

Yanıtlar:


308
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>(whatever version is current)</version>
        <configuration>
          <!-- or whatever version you use -->
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

Maven derleyici eklentisi için yapılandırma sayfasına bakınız:

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

Oh, ve: Java 1.3.x kullanma, mevcut sürümleri Java 1.7.x veya 1.8.x


4
Maven Enforcer Plugin ile Maven'i çalıştırmak için kullandığınız JDK sürümüne bir kontrol eklemek de isteyebilirsiniz: maven.apache.org/enforcer/maven-enforcer-plugin Farklı projeleri desteklemem gerektiğinden bunu çok uygun buluyorum farklı JDK sürümlerinde. Örneğin bir Java 7 projesinde Java 8 ile derlemenizi önler.
Wim Deblauwe

2
Eklenti sürümü eksik. Bir hata atmaz, ancak sürümü orada ayarlamak şiddetle tavsiye edilir. Mevcut sürüm 3.3
Lukas Werner

1
@LukasWerner elbette haklısın. ancak bir sürüm eklersem soruyu birkaç ayda bir düzenlemeniz gerekir. uzlaşma için gitti :-)
Sean Patrick Floyd

LÜTFEN açıklığa kavuşturun ... <version> (mevcut sürüm ne olursa olsun) </version> bu etikete ne giriyor? 1.7 gibi bir şey mi?
Elijah

2
@Elijah hayır, bu java dili versiyonu olurdu. Eklenti sürümü hakkında konuşuyorum. bunu bu bağlantıdan bulabilirsiniz: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd

360

maven-compiler-plugin pom.xml dosyasındaki eklenti hiyerarşi bağımlılığında zaten var. Etkili POM check-in yapın.

Kısacası bunun gibi özellikleri kullanabilirsiniz:

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

Maven 3.2.5 kullanıyorum


"En iyi" hangi yol? Bu, seçilen cevaba kıyasla daha az ayrıntılı, ancak bir çeşit gizli görünüyor. Maven sitesi belgeleri bile eklentinin kullanımını gösterir.
mkobit

2
@mkobit Sanırım bu kişisel bir seçim. Derleyici ve kaynak sürümü dışında başka bir şey yapılandırmam gerekirse, bunu eklentiler bölümünde yapmayı tercih ederim.
leocborges

1
"Başka bir şey yapılandır" ile iyi bir nokta. Google / hata eğilimli gibi bir şey kullanmak istersem , eklentiler bölümü yolunu kullanmam gerekirdi.
mkobit

5
Bu, Maven dokümantasyon sayfasında @mkobit'in verdiği ilk yöntemdir. Çok daha hoş ve derleyici eklentisinin sürümünü sabitlemenize gerek yok.
Danila Piatov

Projeyi IntelliJ'de yeniden oluşturduktan sonra bu benim için çalıştı. Projeyi yeniden oluşturduğumu farz ettiğim yeni bir proje olarak projenin pom dosyasını açarak IntelliJ'deki projeyi yeniden açmak zorunda kaldım.
user674669

13

Genellikle yalnızca sourcesürüme değer vermek istemezsiniz ( javac -source 1.8örneğin) hem sürüme hem sourcede targetsürüme değer vermek istersiniz ( javac -source 1.8 -target 1.8örneğin).
Java 9'dan, çapraz derleme uyumluluğu ( javac -release 9) için hem bilgileri hem de daha sağlam bir şekilde aktarmanın bir yolunun olduğunu unutmayın . Komutu
saran Maven, javactüm bu JVM standart seçeneklerini iletmek için birçok yol sağlar.

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

Kullanılması maven-compiler-pluginveya maven.compiler.source/ maven.compiler.targetözelliklerini belirtmek 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 .

Maven-compiler-plugin 3.6'dan Java sürümünü belirtmenin yeni bir yolu var

Sen kullanabilirsiniz argüman :release

<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 yalnızca kullanıcı özelliğini de bildirebilirsiniz maven.compiler.release:

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

Ancak şu anda, maven-compiler-pluginkullandığınız varsayılan sürüm yeterince yeni bir sürüme bağlı olmadığından sonuncusu yeterli olmayacaktır.

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?

Java 8 ve altı için:

Ne maven.compiler.source/ maven.compiler.targetözellikleri ne de kullanmak maven-compiler-plugindaha iyidir. Sonunda iki yol 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) sourceve için aynı sürümü kullanmak isteyip istemediğinizi kuvvetle değerlendirmenin bir yoludur target.


10

Tutulma neon basit maven java projesinde aynı sorunla karşılaştım

Ama pom.xml dosyasının içine aşağıdaki detayları ekliyorum

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

Projeye sağ tıkladıktan sonra> maven> projeyi güncelle (kontrol edilen kuvvet güncellemesi)

Projede hata göstermek için beni çözüyor

Umarım faydalı olur

thansk


SQL Server için Microsoft JDBC sürücüsü için SqlServerSample uygulaması oluşturmaya çalışırken bu benim için çalıştı.
skye --- kaptan

0
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <fork>true</fork>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin> 
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.