JDKバージョンを指定する方法
1)<java.version>
はMavenのドキュメントで参照されていません。
これはSpring Boot固有のものです。
ソースとターゲットのJavaバージョンを同じバージョンに設定して、両方にjava 1.8を指定できます。
<properties>
<java.version>1.8</java.version>
</properties>
Spring Bootをご利用の方は、お気軽にご利用ください。
2)maven-compiler-plugin
またはmaven.compiler.source
/ maven.compiler.target
プロパティを使用して、source
およびを指定することtarget
は同等です。
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
そして
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
コンパイラプラグインのMavenドキュメントによれば
、<source>
と<target>
コンパイラ設定の要素がプロパティmaven.compiler.source
を使用し、maven.compiler.target
それらが定義されている場合は同等です。
ソース
-source
Javaコンパイラの引数。
デフォルト値はです1.6
。
ユーザープロパティはですmaven.compiler.source
。
目標
-target
Javaコンパイラの引数。
デフォルト値はです1.6
。
ユーザープロパティはですmaven.compiler.target
。
デフォルトの値についてsource
と target
することを、ノート
ので、3.8.0
Mavenのコンパイラの、デフォルト値から変更されている1.5
に1.6
。
3)maven-compiler-plugin 3.6
以降のバージョンでは、新しい方法が提供されています。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
次のように宣言することもできます:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
しかし、現時点では、maven-compiler-plugin
使用するデフォルトバージョンが最新の十分なバージョンに依存していないため、機能しません。
Maven release
引数は次のことを伝え release
ます。Java9 から渡すことができる新しいJVM標準オプション:
特定のVMバージョンについて、公開され、サポートされ、文書化されているAPIに対してコンパイルします。
この方法では、のために同じバージョンを指定するための標準的な方法を提供source
、target
およびbootstrap
JVMオプションを。
を指定することbootstrap
はクロスコンパイルに適した方法であり、クロスコンパイルを行わなくても問題はありません。
JDKバージョンを指定する最良の方法はどれですか?
最初の方法(<java.version>
)は、Spring Bootを使用する場合にのみ許可されます。
Java 8以下の場合:
その他の2つの方法について:maven.compiler.source
/ maven.compiler.target
プロパティを評価するか、を使用してmaven-compiler-plugin
、どちらか一方を使用できます。最後に2つのソリューションが同じプロパティと同じメカニズムに依存しているため、これは事実を変更しません:Mavenコアコンパイラプラグイン。
まあ、コンパイラプラグインでJavaバージョン以外のプロパティや動作を指定する必要がない場合は、この方法を使用する方が簡潔です。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Java 9から:
release
引数(第3ポイント)を使用すると、ソースとターゲットのための同じバージョンを使用したい場合は、強く考慮するための方法です。
JAVA_HOMEのJDKとpom.xmlで指定されたJDKのバージョンが異なる場合はどうなりますか?
によって参照されるJDK JAVA_HOME
がpomで指定されたバージョンと互換性がある場合は問題ありませんが、クロスコンパイルの互換性を高めるbootstrap
にrt.jar
は、target
バージョンのパスを値としてJVMオプションを追加することを検討してください。
考慮すべき重要なことは、ということであるsource
とtarget
Mavenの構成のバージョンがで参照されるJDKのバージョンよりも優れてはなりませんJAVA_HOME
。
JDKの古いバージョンは、その仕様を知らないため、新しいバージョンでコンパイルできません。
使用されているJDKに応じて、ソース、ターゲット、リリースのサポートされているバージョンに関する情報を取得するには、javaコンパイル:ソース、ターゲット、リリースのサポートされているバージョンを参照してください。
JAVA_HOMEによって参照されるJDKのケースをどのように処理するかは、pomで指定されたJavaターゲットやソースバージョンと互換性がありませんか?
たとえばJAVA_HOME
、JDK 1.7を参照していて、pom.xmlのコンパイラー構成でソースおよびターゲットとしてJDK 1.8を指定した場合、JDK 1.7でコンパイルする方法がわからないため、問題になります。 。
その観点から、それはその後リリースされたので、未知のJDKバージョンです。
この場合、次の方法でJDKを指定するようにMavenコンパイラプラグインを設定する必要があります。
<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コンパイラプラグインを使用した例では、詳細を確認できます。
質問はされませんが、ソースを指定してターゲットを指定しない場合は、さらに複雑になる可能性があります。ソースバージョンに応じて、ターゲットで異なるバージョンを使用する場合があります。ルールは特別です。それらについては、クロスコンパイルオプションの部分で読むことができます。
コンパイラプラグインがpackage
pom.xmlで指定されていなくても、Maven ゴールの実行時に出力でトレースされるのはなぜですか?
コードをコンパイルし、より一般的にはMavenの目標に必要なすべてのタスクを実行するには、Mavenにツールが必要です。だから、それは(あなたがすることによって、そのコアMavenプラグインを認識コアのMavenプラグインを使用していますgroupId
:org.apache.maven.plugins
あなたがいない場合でも、クラスをコンパイルするためのコンパイラプラグイン、テストを実行するためのテストプラグイン、およびそのための...だから、:必要なタスクを実行するために)これらのプラグインを宣言すると、Mavenライフサイクルの実行にバインドされます。
Mavenプロジェクトのルートディレクトリで次のコマンドを実行mvn help:effective-pom
すると、最終的なpomを効果的に使用できます。他の情報の中で、Mavenによって添付されたプラグイン(pom.xmlで指定されているかどうかにかかわらず)、使用されているバージョン、それらの構成、およびライフサイクルの各フェーズの実行された目標を確認できます。
mvn help:effective-pom
コマンドの出力では、<build><plugins>
要素内のこれらのコアプラグインの宣言を確認できます。次に例を示します。
...
<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ドキュメントのMavenライフサイクルの紹介をご覧ください。
それでも、これらのプラグインをデフォルト値として他の値で構成したい場合(たとえば、pom.xmlでmaven-compilerプラグインを宣言して、使用するJDKバージョンを調整したときに)、またはMavenライフサイクルでデフォルトで使用されないプラグイン実行を追加したい。
<maven.compiler.x>
プロパティに固執することになります。