Como especificar a versão do JDK?
1) <java.version>
não é mencionado na documentação do Maven.
É uma especificidade do Spring Boot.
Ele permite definir a versão java de origem e de destino com a mesma versão, como esta, para especificar o java 1.8 para ambos:
<properties>
<java.version>1.8</java.version>
</properties>
Sinta-se livre para usá-lo se você usa o Spring Boot.
2) Usando maven-compiler-plugin
ou maven.compiler.source
/ maven.compiler.target
properties para especificar the source
e the target
sã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.source
e maven.compiler.target
se elas estão definidas.
fonte
O -source
argumento para o compilador Java.
O valor padrão é: 1.6
.
Propriedade de usuário é: maven.compiler.source
.
alvo
O -target
argumento para o compilador Java.
O valor padrão é: 1.6
.
Propriedade de usuário é: maven.compiler.target
.
Sobre os valores padrão para source
e target
, observe que,
desde o 3.8.0
compilador maven, os valores padrão foram alterados de 1.5
para1.6
.
3) O maven-compiler-plugin 3.6
e versões posteriores oferecem uma nova maneira:
<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:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Mas, no momento, não funcionará, pois a maven-compiler-plugin
versão padrão usada não depende de uma versão suficientemente recente.
O release
argumento 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 target
e bootstrap
JVM.
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?
A primeira maneira ( <java.version>
) é permitida apenas se você usar o Spring Boot.
Para Java 8 e abaixo:
Sobre as duas outras maneiras: avaliar as propriedades maven.compiler.source
/ ou usar as , você pode usar uma ou outra. Isso não muda nada nos fatos, pois, finalmente, as duas soluções contam com as mesmas propriedades e o mesmo mecanismo: o plug-in do compilador principal do maven. maven.compiler.target
maven-compiler-plugin
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 release
argumento (terceiro ponto) é uma maneira de considerar fortemente se você deseja usar a mesma versão para a origem e o destino.
O que acontece se a versão diferir entre o JDK em JAVA_HOME e qual especificado no pom.xml?
Não é um problema se o JDK referenciado pelo JAVA_HOME
é compatível com a versão especificada na pom mas para garantir uma melhor compatibilidade cross-compilação pensar sobre a adição da bootstrap
opção JVM com o maior valor o caminho do rt.jar
da target
versão.
Uma coisa importante a considerar é que a source
ea target
versão na configuração Maven não deve ser superior à versão JDK referenciado pelo JAVA_HOME
.
Uma versão mais antiga do JDK não pode ser compilada com uma versão mais recente, pois não conhece sua especificação.
Para obter informações sobre a origem, o destino e a versão suportada, de acordo com o JDK usado, consulte a compilação java: fonte, o destino e a versão suportada .
Como lidar com o caso do JDK referido pelo JAVA_HOME não é compatível com o destino java e / ou as versões de origem especificadas no pom?
Por exemplo, se você se JAVA_HOME
referir a um JDK 1.7 e especificar um JDK 1.8 como origem e destino na configuração do compilador do seu pom.xml, será um problema porque, conforme explicado, o JDK 1.7 não sabe como compilar com .
Do seu ponto de vista, é uma versão desconhecida do JDK desde que foi lançada depois dela.
Nesse caso, você deve configurar o plug-in do compilador Maven para especificar o JDK desta maneira:
<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>
Você pode obter mais detalhes em exemplos com o plug-in do compilador maven .
Não é solicitado, mas os casos em que isso pode ser mais complicado são quando você especifica a origem, mas não o destino. Pode usar uma versão diferente no destino, de acordo com a versão de origem. As regras são particulares: você pode ler sobre elas na parte Opções de compilação cruzada .
Por que o plug-in do compilador é rastreado na saída na execução do package
objetivo do Maven, mesmo que você não o especifique no pom.xml?
Para compilar seu código e, de maneira mais geral, executar todas as tarefas necessárias para um objetivo final, o Maven precisa de ferramentas. Portanto, ele usa plugins principais do Maven (você reconhece um plug-in principal do Maven por groupId
: org.apache.maven.plugins
:) para executar as tarefas necessárias: plug-in do compilador para compilar classes, plug-in de teste para executar testes e assim por diante ... Então, mesmo que você não o faça declarar esses plug-ins, eles estão vinculados à execução do ciclo de vida do Maven.
No diretório raiz do seu projeto Maven, você pode executar o comando: mvn help:effective-pom
para obter o pom final efetivamente usado. Você pode ver, entre outras informações, plugins anexados pelo Maven (especificados ou não no seu pom.xml), com a versão usada, sua configuração e os objetivos executados para cada fase do ciclo de vida.
Na saída do mvn help:effective-pom
comando, você pode ver a declaração desses plugins principais no <build><plugins>
elemento, por exemplo:
...
<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>
...
Você pode obter mais informações sobre isso na introdução do ciclo de vida do Maven na documentação do Maven .
No entanto, você pode declarar esses plug-ins quando desejar configurá-los com outros valores como valores padrão (por exemplo, você o fez quando declarou o plug-in maven-compiler em seu pom.xml para ajustar a versão do JDK a ser usada) ou quando deseja adicionar algumas execuções de plug-ins não usadas por padrão no ciclo de vida do Maven.
<maven.compiler.x>
propriedade a partir de agora.