Come si specifica la versione del compilatore Java in un file pom.xml?


252

Ho scritto un codice maven su netbeans che ha approssimativamente più di 2000 righe. Quando lo compilo su netbeans, tutto va bene, ma se voglio eseguirlo dalla riga di comando, otterrò questi errori:

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

Ho provato a usare Java 1.3.1, errori del compilatore , ma ho ottenuto più errori. Ho trovato da altri post che dovrei modificare pom.xml, ma non so come. Ecco il mio 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>

Sarebbe bello se mi potessi aiutare.


2
È ora di aggiornare la versione java.
Sotirios Delimanolis,

5
I generici sono supportati da Java 5. Impossibile farli funzionare prima di quella versione di Java.
Luiggi Mendoza,

L'impostazione predefinita per OpenJDK javac è 1.3, mentre per Oracle JDK è 1.5
Thorbjørn Ravn Andersen,

Entrambi mi precedono come programmatore!
Coray:

Risposte:


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

Vedi la pagina di configurazione per il plugin del compilatore Maven:

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

Oh, e: non usare Java 1.3.x, le versioni correnti sono Java 1.7.xo 1.8.x


4
Potresti anche voler aggiungere un segno di spunta sulla versione JDK che stai utilizzando per eseguire Maven con il plugin Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin Lo trovo molto conveniente in quanto devo supportare diversi progetti che sono su diverse versioni di JDK. Evita ad esempio di compilare con Java 8 su un progetto Java 7.
Wim Deblauwe,

2
Manca la versione del plugin. Non genererebbe un errore, ma si consiglia vivamente di impostare la versione lì. La versione attuale è 3.3
Lukas Werner,

1
@LukasWerner, ovviamente, hai ragione. ma se aggiungo una versione devo modificare la domanda ogni pochi mesi. è andato a un compromesso :-)
Sean Patrick Floyd,

PER FAVORE chiarire ... Cosa contiene questo tag <version> (qualunque versione sia attuale) </version>? È qualcosa come 1.7?
Elia l'

2
@Elia no, quella sarebbe la versione in linguaggio java. Sto parlando della versione del plugin. puoi trovarlo attraverso questo link: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd,

360

maven-compiler-plugin è già presente nella dipendenza della gerarchia dei plugin in pom.xml. Controlla in efficace POM.

In breve puoi usare proprietà come questa:

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

Sto usando Maven 3.2.5


In che modo è "migliore"? Questo è meno dettagliato rispetto alla risposta selezionata, ma sembra nascosto. Anche la documentazione del sito Maven mostra l'utilizzo del plugin.
mkobit,

2
@mkobit Immagino sia una scelta personale. Se devo configurare qualcos'altro oltre al compilatore e alla versione sorgente preferisco farlo nella sezione plugin.
Leocborge,

1
Buon punto con "configura qualcos'altro". Se voglio usare qualcosa come google / soggetto a errori , dovrei usare la sezione plugin.
mkobit,

5
Questo è ora il primo metodo nella pagina della documentazione di Maven che ha dato @mkobit. Molto più bello e non è necessario aggiungere la versione del plug-in del compilatore.
Danila Piatov,

Questo ha funzionato per me dopo aver ricreato il progetto in IntelliJ. Ho dovuto riaprire il progetto in IntelliJ aprendo il file pom del progetto come nuovo progetto che presumo abbia ricreato il progetto.
user674669,

13

Generalmente non si desidera valutare solo la sourceversione ( javac -source 1.8ad esempio) ma si desidera valutare sia sourcela targetversione che la versione ( javac -source 1.8 -target 1.8ad esempio).
Da Java 9, hai un modo per trasmettere entrambe le informazioni e in un modo più robusto per la compatibilità tra compilazioni ( javac -release 9).
Maven che avvolge il javaccomando offre diversi modi per trasmettere tutte queste opzioni standard JVM.

Come specificare la versione JDK?

Utilizzando maven-compiler-plugino maven.compiler.source/ maven.compiler.targetproperties per specificare sourcee e targetsono equivalenti.

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

e

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

sono equivalenti secondo la documentazione Maven del plug-in del compilatore poiché <source>gli <target>elementi e nella configurazione del compilatore usano le proprietà maven.compiler.sourcee maven.compiler.targetse sono definiti.

fonte

L' -sourceargomento per il compilatore Java.
Il valore di default è: 1.6.
Proprietà utente è: maven.compiler.source.

bersaglio

L' -targetargomento per il compilatore Java.
Il valore di default è: 1.6.
Proprietà utente è: maven.compiler.target.

Informazioni sui valori predefiniti per sourcee target, si noti che dal 3.8.0compilatore del maven, i valori predefiniti sono cambiati da 1.5a1.6 .

Da maven-compiler-plugin 3.6 hai un nuovo modo per specificare la versione di Java

Puoi usare l' releaseargomento :

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

Puoi anche dichiarare solo la proprietà dell'utente maven.compiler.release:

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

Ma in questo momento l'ultimo non sarà sufficiente poiché la maven-compiler-pluginversione predefinita che usi non si basa su una versione abbastanza recente.

L' releaseargomento Maven trasmette release: una nuova opzione standard JVM che potremmo passare da Java 9:

Compilare contro l'API pubblica, supportata e documentata per una versione specifica della VM.

In questo modo viene fornito un modo standard per specificare la stessa versione per le opzioni source, the targete bootstrapJVM.
Si noti che specificare bootstrapè una buona pratica per compilazioni incrociate e non farà male se non si effettuano compilazioni incrociate.

Qual è il modo migliore per specificare la versione JDK?

Per Java 8 e versioni precedenti:

maven.compiler.source/ maven.compiler.targetproprietà o l' utilizzo di maven-compiler-pluginè meglio. Non cambia nulla nei fatti poiché alla fine i due modi si basano sulle stesse proprietà e sullo stesso meccanismo: il plug-in del compilatore core maven.

Bene, se non è necessario specificare altre proprietà o comportamenti rispetto alle versioni Java nel plug-in del compilatore, l'utilizzo in questo modo ha più senso in quanto è più conciso:

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

Da Java 9:

L' releaseargomento (terzo punto) è un modo di considerare fortemente se si desidera utilizzare la stessa versione per sourcee target.


10

Ho affrontato lo stesso problema nel progetto java maven al neon eclipse neon

Ma aggiungo i dettagli di seguito all'interno del file pom.xml

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

Dopo aver fatto clic con il tasto destro del mouse su progetto> maven> aggiorna progetto (verifica forzata aggiornamento)

Mi risolve a visualizzare l'errore sul progetto

Spero che sia utile

thansk


Questo ha funzionato per me quando stavo cercando di creare l'app SqlServerSample per il driver Microsoft JDBC per SQL Server.
skye --- capitano

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> 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.