- - スポイラー警告 - -
簡単に言えば、ソースを古いバージョンにコンパイルするには、-source
オプションと-bootclasspath
. この記事を参照してください。また、ソースを新しいバージョンにコンパイルする場合は、コンパイラ プラグインで 、 、 、 、<source>
および<target>
を<compilerVersion>
設定<fork>
し、 surefireプラグインで設定する必要があります...<executable>
<jvm>
そして今、物語のために...
私は同じ問題に遭遇しました。<source>
以前のバージョンをコンパイルするのは、とを設定するほど簡単ではないことがわかりまし<target>
た。私の特定のケースは、Java 1.7 JDK を使用していて、私のクラスが 1.7 と非互換であることです(私が実装しているインターフェースに新しいメソッドが追加されました)。コンパイルしようとすると、インターフェイス メソッドが実装されていないことを示すエラー メッセージがコンパイラから表示されました。とにかく、コンパイラプラグインを設定してみました:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
しかし、ビルドを実行すると、同じエラーが発生しました。だから私はデバッグでmavenを実行し、これを見ました:
[INFO] [DEBUG] Command line options:
[INFO] [DEBUG] -d C:\... -nowarn -target 1.6 -source 1.6 -encoding UTF-8
... は、簡潔にするために実際の引数の代わりに配置されていることに注意してください。
出力で。で始まるメッセージ-d
は、実際の完全なコンパイル引数リストです。そのため、フラグを削除し-nowarn
て残りをjavac
コマンド ラインに貼り付けると、コンパイラからの実際の出力を確認できます。
javac -d C:\... -target 1.6 -source 1.6 -encoding UTF-8
warning: [options] bootstrap class path not set in conjunction with -source 1.6
これは、 -source 1.6 と組み合わせて設定されていない便利な警告ブートストラップ クラス パスを出力します。それについて少しグーグルすると、次のように述べているこの記事が表示されます。
JDK N から古いプラットフォーム バージョンへのクロスコンパイラに javac を使用する正しい方法は次のとおりです。
- 古い -source 設定を使用します。
- 古いプラットフォームの rt.jar (または同等のもの) に対してコンパイルするように bootclasspath を設定します。
2 番目の手順を実行しない場合、javac は古い言語規則を新しいライブラリと組み合わせて忠実に使用します。これにより、存在しないメソッドへの参照が含まれる可能性があるため、古いプラットフォームでは機能しないクラス ファイルが作成される可能性があります。
コンパイラプラグインのMavenドキュメントを参照すると、次のようになります。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<compilerArguments>
<verbose />
<bootclasspath>${java.home}\lib\rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
これを以前の構成と組み合わせて、次を取得できます。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
<bootclasspath>${java.home}\lib\rt.jar</bootclasspath>
</configuration>
</plugin>
次に、変数を mvn で使用できるようにする必要があり${java.home}
ます (-D システム プロパティを使用するか、単純な古い環境変数を使用するか、ユーザー設定の Java 6 プロファイルに非常に凝って詰め込むことができます)。
ビルドを実行して、冷えたビールを飲みに行きましょう...
- - 編集 - -
最後にもう 1 つ... bootclasspath に rt.jar を含めることは常に必要ですが、ケースバイケースでさらに必要になる場合があることを発見しました。アプリが暗号化作業を行っていたため、(rt.jar と同じディレクトリに) jce.jar を含める必要がありました。
---- 編集 2 ----
笑顔のために、私はそれを別の方向に試しました. Java 6 用にコンパイルした Java 7 を使用して Maven を実行する代わりに、Java 7 用にコンパイルした Java 6 を使用して Maven を実行しました。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
<verbose>true</verbose>
<compilerVersion>1.7</compilerVersion>
<executable>${JAVA_7_HOME}/bin/javac</executable>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
基本的に、私は<source>
and<target>
を 1.7 に設定しましたが、6 は 7 のコードをコンパイルできないため、明らかにそれだけでは十分ではありません。コンパイラプラグインに戻ると、実際には、何をする必要があるかを説明するサンプルページがあります。<fork>
つまり、 Java 7 を使用して新しいプロセスをオフにする必要があります<executable>
。だから今、私はすべての準備ができていると思います。ビルドを起動する時間です...
C:\Projects\my-project>mvn package
...
Caused by: java.lang.UnsupportedClassVersionError: mypackage.StupidTest : Unsup
ported major.minor version 51.0
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
UnsupportedClassVersionError とは一体何ですか? よく見ると、失敗しているのは maven-surefire-plugin であることがわかります。したがってmvn compile
、確実なプラグインが決して起動しないので、成功することを確認してください。だから私はmvn -X package
この宝石を実行して気づきました:
Forking command line: cmd.exe /X /C ""C:\Program Files\Java\jdk1.6.0_29\jre\bin\
java" -jar C:\Projects\my-project\target\surefire\surefirebooter2373372991878002
398.jar C:\Projects\my-project\target\surefire\surefire1861974777102399530tmp C:
\Projects\my-project\target\surefire\surefire4120025668267754796tmp"
OK、それで Java 6 を実行しています。なぜですか? 確実なドキュメントには、次のように記載されています。
jvm:
Option to specify the jvm (or path to the java executable) to use with the forking
options. For the default, the jvm will be a new instance of the same VM as the one
used to run Maven. JVM settings are not inherited from MAVEN_OPTS.
mvn を Java 6 VM で実行したため、単体テストのために Java 6 VM をフォークしました。したがって、このオプションを適切に設定します。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<jvm>${JAVA_7_HOME}/bin/java</jvm>
</configuration>
</plugin>
そして、ビルドを起動します...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------