2009-04-15 5 views
1

は私のシナリオです:異なるJDKバージョンのJavaビルド:同じ成果物ですか?ここ

  • ワークステーションA:SunのJDK 1.6
  • ワークステーションB:日JDK 1.5

私はAとBの上に構築したAnt 1.7

<javac srcdir="${foo}" destdir="${bar}" source="1.5" target="1.5"> 
    <include name="**/*.java"/> 
    <exclude name="**/test/**/*.java"/> 
</javac> 

それでも.classファイルはABでは異なるサイズですが、CRCだけではありません。それはこの方法であるはずですか?私は明白な何かを逃していますか?

答えて

5

はい、そのようになっています。同じVMを対象としている場合でも、異なるコンパイラが異なるバイトコードを出力することがあります。結果として得られるプログラムが正しく動作する限り、JLSはソースコードをバイトコードにコンパイルする方法を厳密に要求しません。

5

あなたが明示的に設定かもしれませんがsource="1.5"target="1.5"が、これはjavacコンパイラのJDKのバージョンが実行されているない制御を行います。

したがって、JAVA_HOME/PATH(JDK 1.6を指す)のワークステーションでは、1.5 JREと互換性がある1.6 javacでビルドされたクラスファイルがあります。

ただし、source="1.5"およびtarget="1.5"は、構文/言語機能の互換性のみを指定します。 1.6 JREでのみ利用可能ないくつかのクラスに頼っているのであれば、1.6 javacでsource="1.5"target="1.5"を使用すると、ここでコンパイラの警告が表示されません。

この最後の点に対処するには、別のbootclasspathを使用するように、<javac>のAntタスクに指示する必要があります。

+0

+1 - 答えではなく有用なヒント(考えていなかった) –

+0

これはかなり不自然な回避策です - 正しいインデントされたjdkを使用するほうがはるかに簡単です –

関連する問題