Como você especifica a versão do compilador Java em um arquivo pom.xml?

252

Eu escrevi um código maven no netbeans que tem aproximadamente mais de 2000 linhas. Quando eu compilar no netbeans, está tudo bem, mas se eu quiser executá-lo na linha de comando, receberei os seguintes erros:

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

Tentei usar o Java 1.3.1, erros de compilador , mas obtive mais erros. Descobri em outras postagens que eu deveria modificar o pom.xml, mas não sei como. Aqui está o meu 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>

Seria ótimo se você pudesse me ajudar.

MTT
fonte
2
Hora de atualizar a versão java.
Sotirios Delimanolis
5
Os genéricos são suportados no Java 5. Impossível fazê-los funcionar antes dessa versão do Java.
Luiggi Mendoza 23/05
O padrão para o OpenJDK javac é 1,3, enquanto para o Oracle JDK é 1,5
Thorbjørn Ravn Andersen
Ambos me antecederam ser um programador!
CorayThan

Respostas:

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>

Veja a página de configuração para o plugin do compilador maven:

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

Ah, e: não use o Java 1.3.x, as versões atuais são Java 1.7.x ou 1.8.x

Sean Patrick Floyd
fonte
4
Você também pode adicionar uma verificação na versão do JDK que está usando para executar o Maven com o plug-in do Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin Acho isso muito conveniente, pois tenho que apoiar projetos diferentes que estão em diferentes versões do JDK. Evita que você compile com o Java 8 em um projeto Java 7, por exemplo.
Wim Deblauwe
2
A versão do plug-in está ausente. Não causaria um erro, mas é altamente recomendável definir a versão lá. A versão atual é 3.3
Lukas Werner
1
@LukasWerner, você está certo, é claro. mas se eu adicionar uma versão, tenho que editar a pergunta a cada poucos meses. fui para um compromisso :-)
Sean Patrick Floyd
POR FAVOR, esclareça ... O que há nesta tag <versão> (qualquer versão atual) </ versão>? É algo como 1,7?
Eliash
2
@ Elijah não, essa seria a versão da linguagem java. Eu estou falando sobre a versão do plugin. você pode achar que através deste link: mvnrepository.com/artifact/org.apache.maven.plugins/...
Sean Patrick Floyd
360

O maven-compiler-plugin já está presente na dependência da hierarquia de plugins no pom.xml. Faça check-in no POM efetivo.

Em resumo, você pode usar propriedades como esta:

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

Estou usando o maven 3.2.5

Leocborges
fonte
Qual o caminho é "melhor"? Este é menos detalhado em comparação com a resposta selecionada, mas parece meio oculto. Até a documentação do site do Maven mostra o uso do plug-in.
Mkobit 15/10/2015
2
@mkobit Acho que é uma escolha pessoal. Se eu precisar configurar outra coisa além da versão do compilador e da fonte, prefiro fazer isso na seção de plugins.
Leocborges
1
Bom ponto com o "configurar outra coisa". Se eu quiser usar algo como o Google / propenso a erros , teria que usar a seção de plugins.
Mkobit
5
Agora, este é o primeiro método na página de documentação do Maven que o @mkobit forneceu. Muito melhor, e você não precisa fixar a versão do plug-in do compilador.
Danila Piatov
Isso funcionou para mim depois que recriei o projeto no IntelliJ. Eu tive que reabrir o projeto no IntelliJ abrindo o arquivo pom do projeto como um novo projeto que, suponho, recriou o projeto.
user674669
13

Geralmente, você não deseja avaliar apenas a sourceversão ( javac -source 1.8por exemplo), mas deseja valorizar sourcea targetversão e a ( javac -source 1.8 -target 1.8por exemplo).
Observe que no Java 9, você tem uma maneira de transmitir informações e de uma maneira mais robusta para compatibilidade de compilação cruzada ( javac -release 9).
O Maven que envolve o javaccomando fornece várias maneiras de transmitir todas essas opções padrão da JVM.

Como especificar a versão do JDK?

Usando maven-compiler-pluginou maven.compiler.source/ maven.compiler.targetproperties para especificar the sourcee the targetsão equivalentes.

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

são equivalentes de acordo com a documentação do Maven do plug-in do compilador, pois <source>os <target>elementos e na configuração do compilador usam as propriedades maven.compiler.sourcee maven.compiler.targetse elas estão definidas.

fonte

O -sourceargumento para o compilador Java.
O valor padrão é: 1.6.
Propriedade de usuário é: maven.compiler.source.

alvo

O -targetargumento para o compilador Java.
O valor padrão é: 1.6.
Propriedade de usuário é: maven.compiler.target.

Sobre os valores padrão para sourcee target, observe que, desde o 3.8.0compilador maven, os valores padrão foram alterados de 1.5para1.6 .

No maven-compiler-plugin 3.6, você tem uma nova maneira de especificar a versão Java

Você pode usar o releaseargumento :

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

Você também pode declarar apenas a propriedade do usuário maven.compiler.release:

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

Mas, neste momento, a última não será suficiente, pois a maven-compiler-pluginversão padrão usada não depende de uma versão recente o suficiente.

O releaseargumento Maven transmite release: uma nova opção padrão da JVM que poderíamos passar do Java 9:

Compila na API pública, suportada e documentada para uma versão específica da VM.

Essa maneira fornece uma maneira padrão de especificar a mesma versão para as opções source, the targete bootstrapJVM.
Observe que especificar bootstrapé uma boa prática para compilações cruzadas e não será prejudicial se você também não fizer compilações cruzadas.

Qual é a melhor maneira de especificar a versão do JDK?

Para Java 8 e abaixo:

Nem maven.compiler.source/ maven.compiler.targetproperties ou usando o maven-compiler-pluginé melhor. Isso não muda nada nos fatos, pois, finalmente, as duas maneiras se baseiam nas mesmas propriedades e no mesmo mecanismo: o plug-in do compilador principal do maven.

Bem, se você não precisar especificar outras propriedades ou comportamento além das versões Java no plug-in do compilador, usar dessa maneira faz mais sentido, pois é mais conciso:

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

Do Java 9:

O releaseargumento (terceiro ponto) é uma maneira de considerar fortemente se você deseja usar a mesma versão para the sourcee the target.

davidxxx
fonte
10

Eu enfrentei o mesmo problema no projeto eclipse neon simple maven java

Mas eu adiciono abaixo os detalhes dentro do arquivo 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>

Após clicar com o botão direito do mouse em projeto> maven> atualizar projeto (atualização de força marcada)

Resolva-me exibir erro no projeto

Espero que seja útil

Thansk

Vijay Gajera
fonte
Isso funcionou para mim quando eu estava tentando criar o aplicativo SqlServerSample para o driver Microsoft JDBC para SQL Server.
skye --- capitão
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> 
Sasidhar Reddy
fonte