2

プロパティ ファイルをエンコード/デコードするためのライブラリを作成しました。ライブラリには 2 つの主な目的があります。

  1. プロパティ ファイルをエンコードし、別のファイルに保存します。
  2. エンコードされたファイルからキー値を返します (ファイルをデコードし、結果を文字列としてメモリに格納し、文字列を Properties オブジェクトに読み込み、プロパティ オブジェクトから結果を返します)。

すべて正常に動作しているように見えますが、今日、ライブラリが Java 1.5 で動作しないことに気付きました。デコード側で問題が発生していることに気付いたので、このコードに注目しましょう。デコードを担当するコードが次のようになっているとします。

String props = "key1=val1\nkey2=val2";
Properties p = new Properties();
p.load(new StringReader(props));
p.list(System.out);

いくつかのテストの後、問題は次の行にあることがわかりました。

p.load(new StringReader(props));

load(Reader)Java 1.5 の Properties クラスに宣言がないことがわかりました。Java 1.5 API 要件を満たすために、この行を に変更しましたload(InputStream)。Everyting は問題なく動作しますが、ここで質問です。

私はプロジェクトをコンパイルするためにgradleを使用していますが、このライブラリはJava 1.5+(コンピューターにJava 1.7がインストールされています)で動作するはずであることを知っていたので、これらの2行をbuild.gradleに追加しました

sourceCompatibility = '1.5'
targetCompatibility = '1.5'

Java コンパイラーは、コードを Java 1.5 と互換性を持ってコンパイルしたいことを認識し、適切なエラーを表示すると思いました。それがgradleの問題ではないことを確認するために、コマンドラインからJavaコードをコンパイルしましたが、同じ結果になりました(コンパイラはエラーを表示しません)。では、コンパイル中にコンパイラがエラーを表示しないのはなぜですか?

Java 1.5 プロパティ クラス API: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Properties.html

Java 1.6 プロパティ クラス API: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html

[アップデート]

API の互換性をチェックしない-sourceか、チェックしません。-targetもしそうなら、どうすればgradleでそれをチェックできますか? millimoose が書いたように、maven にはこのプラグインがあります ( http://mojo.codehaus.org/animal-sniffer-maven-plugin/index.html )。

4

2 に答える 2

4

「クロスコンパイル」および「クロスコンパイルの例」という名前の javac ドキュメントのセクションを参照してください。

http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html#crosscomp-options

具体的には、この部分:

クロスコンパイル時には -bootclasspath と -extdirs を使用することが重要です。以下のクロスコンパイルの例を参照してください.......ブートストラップ クラスの正しいバージョンを指定しない場合、コンパイラは古い言語規則を使用します (この例では、Java プログラミング言語のバージョン 1.6 を使用します)。新しいブートストラップ クラスを使用すると、存在しないメソッドへの参照が含まれる可能性があるため、古いプラットフォーム (この場合は Java SE 6) では動作しないクラス ファイルが作成される可能性があります。

于 2013-09-12T12:42:14.387 に答える
2

この-sourceスイッチは、指定されたバージョンでサポートされていない言語構造を使用した場合にコンパイル エラーを発生させるようにコンパイラに指示するだけです。たとえば-source 1.6、Java 7 以降でのみサポートされているため、try-with-resources を with で使用すると、コンパイル エラーが発生します。その使用は、より健全性チェックです(つまり、私のコードはまだJavaバージョン1.xと互換性がありますか)

この-targetスイッチは、指定されたバージョンと互換性のあるバイト コードを出力するようにコンパイラに指示します。つまり、コンパイルされたコードは、指定されたバージョンの仮想マシンで実行できます。

ただし、これらのスイッチはいずれも、以前の Java バージョンの Java ライブラリとの互換性をコンパイラに確認させません。そのため、Java 7 以降、コンパイラは、コードがクラスのみを使用しているかどうかを確認できるように、その Java バージョンの Java ランタイム ライブラリ セットを指すように-target 1.6指定する必要があるという警告を表示します。-bootclasspathおよびその Java バージョンのメソッド。

于 2013-09-12T12:48:10.573 に答える