Java 5/6の機能をJava 1.4にバックポートしますか?
質問
2010年末までJava2SE v1.4に固執しています。これは本当に厄介ですが、それを助けることはできません。現在、いくつかの新機能をすでに使用するためにどのようなオプションが必要ですか?次のようないくつかの方法を考えることができます
-
バイトコードの変更、例: Retrotranslator または Retroweaver 。
-
ライブラリのバックポート、たとえば同時バックポートが、これはジェネリックには役立ちません。
-
Java 5機能のエミュレーション。チェックされたコレクション、ヘルパーメソッドを含む可変引数など
-
ソースコードをプリコンパイルによって変更し、最終コンパイルの前に1.5をすべて削除します。 Declawer を使用してこれを行うことができます。
私は、Weblogicと「real」を使用した実稼働環境での非常に良い経験に最も興味があります。もの。
解決
ご回答ありがとうございます。すべての関連する回答と私自身の研究の要約です。
バイトコードの変更:レトロ
これは、" retro" -tools : Retrotranslator 、 Retroweaver および JBossRetro 。 Retrotranslatorは最も成熟しているようです
そしてそれらのツールのアクティブ。これらのツールはすべてのクラスをスキャンし、バイトコードを変更してJava 5および6の機能を削除します。多くのJava5機能がサポートされていますが、
サードパーティのバックポートライブラリを使用する。このオプションは最も人気があり、ユーザーからいくつかの肯定的なフィードバックがあります。実験により、
期待した。 developerworks の簡単な概要を参照してください。
Pro:Java 5で完全に開発でき、モジュールとすべての種類のJARをビルドできます。最後に、すべてのクラスをJava 1.4に変換し、EARをパッケージ化します。
これは、RetrotranslatorのMaven統合( org.codehaus.mojo:retrotranslator-maven-plugin
)で簡単に実行できます。
Con:保守的な環境では、変更されたバイトコードをデプロイできません。レトロステップの結果はどのコーダーにも表示されず、承認できません。 2番目の問題は恐怖です:いくつかの不可解な生産上の問題があるかもしれません、そして、レトロコードはそのために非難されるかもしれないもう一つのステップです。アプリサーバーベンダー バイトコードの変更によりヘルプを拒否する場合があります。したがって、本番環境で使用する責任を誰も負いたくありません。これは技術的というよりはむしろ政治的であるため 問題なので、解決策はありません。それは私たちに起こったので、私はさらなるオプションを探していました:-(
Java5からJava 1.4へのコンパイル:jsr14
サポートされていないオプション、 javac -source 1.5および-target jsr14
があり、Java5ソースを有効なJava 1.4バイトコードにコンパイルします。のようなほとんどの機能
とにかく、可変引数または拡張forループはコンパイラーによって変換されます。ジェネリックと注釈は取り除かれます。列挙型はサポートされておらず、わかりません
valueOf
メソッドは主にJava5で導入されたため、オートボクシングについて。
Con:バイトコードのみが変換され、ライブラリの使用法は変更されません。したがって、Java5固有のAPIを使用しないように注意する必要があります(ただし、バックポートは使用できます)。 さらに、開発時には、汎用情報と注釈情報を含むJava5コードが必要になるため、すべてのモジュールを同時にビルドする必要があります。 そのため、Java 1.4のプロダクションでは、プロジェクト全体をゼロから構築する必要があります。
ソースをJava 1.4:Declawerに戻す
関連質問で回答されたように、 Declawer は、コンパイラ拡張機能で、ジェネリックと可変引数、ただし拡張forループまたは
オートボクシング。生成されたソースは「少しファンキーですが、それほど悪くはありません」
Pro:生成されたソースは利用可能であり、確認できます。最悪の場合、このソースで修正することができます。 「マジック」はありません。ソースが 有効なJavaです。一部の人々は、Java 1.4ソースを再度取得するためにJAD(Javaデコンパイラー)を使用します。デバッグでコンパイルする場合、Jad readableの出力は読み取り可能です 情報であり、内部クラスを使用しないでください。
Con: -target jsr14
と同様に、デプロイメントに追加の手順が必要です。ライブラリにも同じ問題があります。
ソースをJava 1.4に戻す:by
他のヒント
ソースコードのプリコンパイル、ストリッピング 最終コンパイル前の1.5のすべて および展開。ツールはありますか これを行うことができますか?
はい。それらはRetrotranslatorまたはRetroweaverと呼ばれます。 Generics(コンパイラーのためだけに存在します)を別にすれば、単に「1.5を取り除く」ことはできません。列挙型(およびおそらく他の機能も)は、機能的に同等のコードに置き換える必要があります。これがまさにこれらのツールの機能です。
JDK 1.5機能を使用してコーディングし、コンパイル時にJDK 1.4をターゲットにできます。利用可能なJavacオプションを参照してください。ただし、現在ほとんどのライブラリはJDK 1.5コードを使用しているため、古いライブラリにとらわれます。
Java 1.4はしばらくEOLでしたが、注目に値します。 Java 5.0は、2009年10月8日にEOLになります。2010年までにJava 5.0を約束するとしたら、その理由をお尋ねします。
Java 1.4で注釈をシミュレートするには、 http://xdoclet.sourceforge.net/を使用できます。 xdoclet / index.html