web-dev-qa-db-ja.com

Javac 1.7とのクロスコンパイル

だからみんな、

私は、Antと端末でJavac Crossコンパイルを少しプレイしようとしています。ローカルおよび統合環境で、非常に基本的な問題で同じ問題が発生しています。

私はこれをLinuxターミナルで(そしてWindowsとcmdのcygwinでも)実行します:

 javac -target 1.6 -source 1.7 -bootclasspath /usr/Java/jdk1.6.0_27/jre/lib/rt.jar Main.Java

system.out.println以外に何もないMain.Java.

javac -version ==> javac 1.7.0_11

エラーメッセージが表示されます。

javac: source release 1.7 requires target release 1.7

ローカルのWindowsマシンでほぼ同じ構成を使用しており、まったく同じ結果が得られます。

クロスコンパイルとは、上位バージョンのjdkを使用して上位バージョンのjdkと互換性のあるソースコードをコンパイルすることですが、おそらくそれよりも低いターゲットバージョンのrt.jarを渡すことであると理解していました。

ターゲットとソースが同じであれば、うまくいきました。

target=1.7 and source=1.7 workd fine

target=1.6 and source=1.6 worked just fine

しかし、私はクロスコンパイルが欲しいので、私が間違っているのは何ですか?

よろしくお願いいたします。よろしくお願いいたします。

17
Eyad Ebrahim

新しいバージョンのソースと低いバージョンのターゲットを使用することはできません。たとえば、Java 5では、ジェネリックス、オートボクシングなどの多くの新機能が言語に追加され、JVM 1.4がそれを理解することは期待できません。したがって、コンパイラに指示する必要があります。あなたのソースコードがJava 1.4ソースコードであること。これはあなたが持っている結果を説明しています。

-targetのデフォルトは、-sourceの値によって異なります。

  • -sourceが指定されていない場合、-targetの値は1.7です。
  • -sourceが1.2の場合、-targetの値は1.4です
  • -sourceが1.3の場合、-targetの値は1.4です
  • -sourceが1.5の場合、-targetの値は1.7です。
  • -sourceが1.6の場合、-targetの値は1.7です。
  • -sourceの他のすべての値の場合、-targetの値は-sourceの値です。

詳細については、 http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/javac.html を参照してください。

13
vinay

これはjavacの制限です。古いバージョンのjavacでは「-target」(-sourceではなく)を指定するだけで解決できることに注意してください。あなたはまだできるかもしれません。

スタンドアロンコンパイラとして、Mavenプラグインとして利用でき、antスクリプトのjavacタスクでも使用できるEclipse Javaコンパイラ(ecj)の使用を検討することをお勧めします。

詳細については、 http://help.Eclipse.org/Indigo/topic/org.Eclipse.jdt.doc.user/tasks/task-using_batch_compiler.htm を参照してください。