1

組み込みデバイスで実行されるJavaアプリケーションがあります。さまざまなデバイスがさまざまなバージョンのデバイスSDKを実行するため、最大5つの異なるデバイスSDKの組み合わせに対してビルドする必要があります。

これらの組み合わせの1つは、既存のオブジェクトの特定のメソッドをサポートせず、SDKから別のオブジェクトを完全に省略します。

このメソッドとオブジェクトをプログラムで使用していますが、特定の構成でのみ使用しているため、それをサポートしていないデバイスで別の構成にフォールバックしたいと思います。

コンパイル時または実行時にこのフォールバック動作を実行できれば幸いです。

このコードを条件付きで削除する最も簡単な方法は何でしょうか?

それ以外の点ではコードは同じなので、2つのSDK用に2つの別々のコードブランチを作成したくないと思います。

Antスクリプトを使用してアプリケーションをビルドします。

私のアプリケーションは、関連する場合、かなり古いバージョンのJDK(1.1.8 / 1.2)に対してビルドする必要があります。

4

2 に答える 2

2

1 つのアイデアは、同じインターフェイス (完全な実装とスタブ) を持つ 2 つのクラスを作成し、両方に isSupported() メソッドを使用し、スタブ内の他のすべてのメソッドが UnsupportedOperationException をスローするようにすることです。次に、Ant スクリプトのコンパイル時に、条件付きで正しいクラスを含めることができます。

より動的なアプローチ@Stephen Cではなく、これを使用することを選択しました。これは、目的に完全に適合し、デバイスへのアクセス(デバイスファイルシステムを含む)が非常に制限されているため、複数のjarの展開、クラスパスの設定、等

私がやったことは次のとおりです:

  1. スタブが必要なクラスを別のパッケージに移動します。
  2. 新しいディレクトリmypackagenamestubを作成し、スタブ化するファイルをそこにコピーします。スタブされるファイルのパッケージ宣言が IDE によって変更されていないことを確認してください。
  3. アプリケーションのビルド対象の SDK に基づいて、Ant スクリプトで SDK パス プロパティを既に設定しているため、別のプロパティomit.unsupportedmode(言い換え) を追加し、必要に応じて true に設定しました。
  4. javac条件タスクを使用して、たとえば**/MyPackageStub/**または**/MyPackage/**ベースの の excludes 属性に渡す値を設定しますomit.unsupportedmode
于 2010-11-12T00:25:44.640 に答える
2

@Lawrence Johnston's self-answer sketches は、ビルド時にこれを行う方法を示しています。これは基本的には正しい考えだと思いますが、おそらくプラグイン API がチェック例外をスローすることを望まないでしょう。理想的には、要求された機能を実行するために「最善の努力」を試みる古いプラットフォームの実装が必要です。

実行時に決定したい場合は、次のことができます。

  • 異なるバージョンのクラスを別々の JAR ファイルに入れ、ラッパー スクリプトを使用して適切な JAR をアプリケーション クラスパスに含めます。

  • Class.forName()プラットフォームに適したクラスのバージョンを動的にロードするために使用します。

いずれの場合も、(すべてのプラットフォームで動作することを意図した) 基本アプリケーション クラスが、より高度な SDK/JDK に静的に依存していないことを確認する必要があります。

最後に、古いバージョンの Java のサポートを終了したいと考えています。それらは何年も前に「寿命を迎えた」ものであり、それらをサポートする必要性は明らかにあなたを妨げています. たとえば、コア アプリケーションに後方互換性が必要であるということは、最近の Java リリースで追加された多くの新機能を利用できないことを意味します。これらの古い Java リリースをまだ使用している顧客はどれくらいいますか? プラットフォームをアップグレードできないのはなぜですか? 彼らはあなたのアプリケーションの最新バージョンを本当に必要としていますか?

于 2010-11-12T00:52:07.830 に答える