web-dev-qa-db-ja.com

javacソースおよびターゲットオプション

どのJDKのディストリビューションが `javac -source 1.6 -target 1.5`を実行できますか? で説明されているようなコンパイルオプションを見ました。ソースとターゲットの個々のオプションを理解しています。ソースバージョンがターゲットバージョンよりも高い理由がわかりません。古いターゲット用にコードをコンパイルするのは理にかなっています。しかし、その場合、実行できるようにしたい最も古いターゲットの-sourceを使用しないでください

25
jogabonito

Javaは下位互換性があります。 -sourceオプションを使用してJavaコンパイルに使用されるバージョンを指定し、-targetオプションを指定して、最も低いJavaサポートするバージョン。たとえば、1.4のターゲットを指定した場合、私のプログラムはJava 1.3以前。次のjavac documentation を参照してください。特にCross-Compilationのセクションを参照してください。オプション

21
greenkode

ピーター・ツェンは、コンパイル中に覚えておくべき重要なポイントをたくさん述べています。実際、私も同じような問題にいつか直面し、多くの問題の根本原因を共有したいと思っています。

コンパイルして互換性を持たなければならないソースコードがありました(-source&-target)Java '1.8'。コード自体には

  1. 商標記号がたくさんあるため、認識できない文字になりました(IntelliJ Ideaのエンコード設定を微調整する必要がありました)
  2. Java.sql.*パッケージに対する多くの変更
  3. 多くのサードパーティライブラリの使用。そこでのデバッグの難しさと、なんとか何とかを説明する恐怖をblしんでください。

一定の変更を加えた後、実行する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"/>
2
Nitin Ramac

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