3

全体で約2000クラスの独自のAPIはほとんどありません。Pathそれらのいくつかは、JDK7の新しいAPIを使用しています。ただし、他のほとんどのクラスは、新しいJDKAPIや新しい言語機能に依存していません。したがって、ほとんどのクラスはJDK6環境で使用できます(これを実行する予定です)。すべてのJDK7のみのクラスに。で注釈を付けたと仮定し@Java7Onlyます。

私が今必要としているのは、新しいバージョンの分岐や製品ラインを導入することなく、すべてのプロジェクトのJDK6のみのサブセットを多かれ少なかれ自動的に作成する方法です(維持するには複雑すぎます)。

すべてのプロジェクトはNetbeansを使用して作成されるため、Antを使用します。多くのプロジェクトは他のプロジェクトに依存しています。

私の問題に応じてどのアイデアが最も適切かを評価するのを手伝ってください。それぞれのアイデアでどのような問題が発生する可能性がありますか?

すべてのアイデアに共通の最初のステップ

  • アノテーションプロセッサに@Java7Only-annotatedクラスを検索させ、リストをpropertiesファイルに保存させます。

アイデア1(特定)

  • propertiesJDK7のみのファイルを除いて、ファイルを使用してプロジェクト全体を再帰的にコピーするツールを作成します。
  • antを呼び出してJDK6を使用してコピーしたプロジェクトをビルドし、JDK6準拠のjarを取得します。

アイデア2(具体的)

  • propertiesこのファイルを使用して、 JDK7のみのファイルを除くすべてをJavaCompilerインスタンスに渡す2番目のアノテーションプロセッサを記述します。
  • Java APIを使用してjarを作成するか、そのためにAntAPIを使用します。

(これはJavaのみのアイデアですが、おそらく複雑すぎます)

アイデアX(要約)

  • どういうわけか(いくつかのターゲットを上書きすることによって)Antビルドプロセスに影響を与え、JDK6準拠のクラスごとに:Antに2つのバージョンをコンパイルさせます(1回はJDK6コンパイラで、もう1回はJDK7コンパイラで)。
  • (もちろん、JDK7のみのクラスは、JDK7コンパイラを使用して1回だけコンパイルされます)
  • 各束を別々の瓶にパッケージします。

アイデアに起こりうる一般的な問題

  • 一部のプロジェクトは他のプロジェクトに依存しているため、一部のアクション(パッケージ化など)ではこれを考慮する必要があります。
  • 覚えておいてください:JDK7コンパイラは下向きに互換性のないクラスファイルを生成します。そのため、考えられるすべてのアイデアはソースレベルで発生する必要があります(ビルドプロセスの前または最中、後ではありません)。
4

2 に答える 2

1

アイデア2についての私の考え:

基本的に、これはコンパイラー内でコンパイラーを呼び出すことです。注釈プロセッサは、コンパイルの一部として実行されます。これは安全に行うことができますか?問題を引き起こすSunのjavacに静的な状態はありますか?(答えはわかりませんが、メモリから、このシナリオで問題を引き起こす可能性のある静的な状態が存在する可能性があります)。

アイデア1は、私にはもっとシンプルで良いように思えます。

しかし、一歩後退して、すべてのJDK 7固有のものを別のモジュールに分離し、それを別のJARに別々にコンパイルすることは可能ですか?

  • JDK 6を使用してコンパイルされた「メイン」プロジェクトを用意します(JDK 7は下位互換性があるため、読み取りに問題はありません)。
  • コンパイルクラスパスの「main」JARを含む別のディレクトリにソースを持つJDK7固有のモジュールは、必要に応じて別のbuild.xmlを使用して個別にビルドできます。
于 2011-07-05T02:01:14.937 に答える
1

これは部分的にしか当てはまりませんが、とにかく言及したいと思います。

検証に-source1.6-target 1.6オプションを使用する場合の問題は、JDK7を使用してコンパイルした場合でもJava7APIを使用できることです。

私は現在、いくつかのプロジェクトでAnimal Sniffer Mavenプラグインを使用しており、非常に便利であることが証明されています。このプラグインは、クラスのバイトコードをスキャンしてJDKAPIを使用します。つまり、JDK6をターゲットにしているときにJDK7 APIを使用しようとすると、ビルドに失敗するように指示できます。これは、必要に応じてクラスを分離するのにあまり役立ちませんが、-と組み合わせた最終検証ステップとして役立つ可能性があります。 source 1.6-target1.6コンパイラオプション。

Animal Snifferのメインページで説明されているように、AnimalSnifferAntプラグインもあります。

于 2011-07-05T01:52:28.030 に答える