どのJDKのディストリビューションが `javac -source 1.6 -target 1.5`を実行できますか? で説明されているようなコンパイルオプションを見ました。ソースとターゲットの個々のオプションを理解しています。ソースバージョンがターゲットバージョンよりも高い理由がわかりません。古いターゲット用にコードをコンパイルするのは理にかなっています。しかし、その場合、実行できるようにしたい最も古いターゲットの-sourceを使用しないでください
Javaは下位互換性があります。 -sourceオプションを使用してJavaコンパイルに使用されるバージョンを指定し、-targetオプションを指定して、最も低いJavaサポートするバージョン。たとえば、1.4のターゲットを指定した場合、私のプログラムはJava 1.3以前。次のjavac documentation を参照してください。特にCross-Compilationのセクションを参照してください。オプション
ピーター・ツェンは、コンパイル中に覚えておくべき重要なポイントをたくさん述べています。実際、私も同じような問題にいつか直面し、多くの問題の根本原因を共有したいと思っています。
コンパイルして互換性を持たなければならないソースコードがありました(-source&-target)Java '1.8'。コード自体には
Java.sql.*
パッケージに対する多くの変更一定の変更を加えた後、実行するJUnitテストケースの量が等しいコードになりました。最終的に私はJava.lang.VerifyError
にぶつかった。さまざまなライブラリ/環境でコードをコンパイルして実行すると、このようなエラーが発生することを理解したときにショックを受けました(そうではありませんでした)。
私がほとんど見逃していたのは、テストは隔離された環境で実行しなければならなかったという事実、Junitとそのテストケースが別々のフォークされたVMで実行された
<target name="runJunit">
<junit printonsummary="on"
haltonfailure="off"
fork="true"
forkmode="once">
<formatter />
<batchtest />
<classpath />
</junit>
</target>
これは明らかに独立したプロセスとして実行され、実行中のスタンドアロンアプリケーションとして機能します。 IDEは両方のプロセスに同期してまたがっていますが、JVMはほぼ分離されています。
Java 1.7の後、Oracleはより厳密な検証を導入し、クラス形式を少し変更しました-コードが正しいことを検証するために使用されるスタックマップを含む。私が見た例外は、いくつかのメソッドが有効なスタックマップを持っていないためでした。
<jvmarg value="bootclasspath:{env.Java_HOME}\jre\bin\rt.jar" prefix="-X"/>
うまくいきませんでした。唯一の回避策は、含めることでした
<jvmarg value=":UseSplitVerifier" prefix="-XX"/>
Java 1.7では、名目上のバイトコード検証のみが許可されます。これはJava 1.8で取り消されたため、唯一のオプションは
<jvmarg value="-noverify"/>
JDK1.8は、-sourceおよび-target 1.6未満をサポートしなくなります
"c:\Program Files\Java\jdk1.8.0_121\bin\javac.exe" -source 1.3 HelloWorld.Java
warning: [options] bootstrap class path not set in conjunction with -source 1.3
warning: [options] source value 1.3 is obsolete and will be removed in a future release
warning: [options] target value 1.4 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
4 warnings