4

私は現在java1.4でのみコンパイルされる大規模なレガシーコードベースに取り組んでいます。私がしなければならないことの1つは、1.6(おそらく今は1.7)で動作させることです。

現在、ヘッドビルドは1.6でコンパイルされていません。これには多くの理由があります。ほとんどの場合enum、キーワードとして使用するなど、簡単に修正できますが、Java1.4で使用できないタイプをサポートするようにOracle/SunがJDBC(接続インターフェイス)を更新するのに苦労しています。つまり、1.6で動作するように変更を加えると、メインの本番ビルドNClobは、1.4リリースにはないので、breakのようなクラスとしてbreakします。変更を加えないと、1.6コンパイラでコンパイルできません。

Javaで条件付きコンパイル/ビルドをサポートするパターンはありますか?私がこれまでに思いついた唯一の計画は、ビルドに応じてクラスを条件付きでスワップイン/スワップアウトするためにantビルドをいじることでした。これはかなり恐ろしいと感じるので、ここのコミュニティに考えを求めます。

繰り返しますが、問題の境界は次のとおりです。

  • 1.4でコンパイルを続行できる必要がありますHEAD(1.4互換モードの1.6はありません)
  • また、1.6でコンパイルする別のヘッドビルドも必要です-これには時間がかかると想定されているため(コードベースが大きいため)、ヘッドビルドを準備している間、他の人が作業を続けて他の変更を提供できるようにするための最初の箇条書きです1.6互換性のため。
  • これは1つの巨大なコードツリーです。これは、私たちのコードがライブラリに依存していないことを意味し、簡単にそうすることはできません(覚えておいてください:レガシーコードベース:(
  • 分岐は許可されていません(理由は、本当に必要な場合を除いて、私は入りません)

よろしくお願いします。

4

4 に答える 4

4

これが、makefiles / pom.xml/build.xmlがチェックインされる理由です。リビジョン管理システムを使用してブランチを作成します。1つのブランチで、1.6の互換性に必要なすべての変更を行います。他のブランチでは、しないでください。任意のブランチは、1.4で安全にコンパイルされるか、1.6で安全にコンパイルされます。両方を同時に実行しようとするフランケンブランチはありません。これは、悪いアイデア(tm)です。

于 2013-01-14T21:44:30.337 に答える
3

port14.jarとを同じクラスport16.jar、同じメソッドで作成しますが、実装は異なります。そして、2つの別々のビルドを作成します。

これは二重の作業を意味しますが、同じコードベースを同時に使用できます。そして、違いは相対的な「マイナー」です。

于 2013-01-14T21:49:05.680 に答える
3

私はMavenを使用しており、両方のバージョンが共有するインターフェースを定義するモジュールがあります。次に、2つのモジュールがあります。1つは1.4コードで、もう1つはバージョンJava 6(または7または8)です。このようにして、両方を構築し、実行時に適切な実装を選択できます。

于 2013-01-14T21:49:38.007 に答える
3

これをカバーする以前のSOの回答があります。基本的には、antのreplaceタスクを使用して、IFDEFブロックの迅速でダーティなバージョンを作成します。これは、クラスファイル全体をスワップアウトするよりもおそらく簡単であり、可能な場合はいつでも完全に1.6にするのが簡単になります(1.4 IFDEFブロックをすべて削除するだけです)。

于 2013-01-14T21:51:03.490 に答える