0

次のサンプル ソース コードがあります。

public interface SomeInterface {
  void method1();

  @Support
  void method2();

  @Support(ENVIRONMENT_A)
  void method3();

  @Support({ ENVIRONMENT_A, ENVIRONMENT_B })
  void method4();
}

上記の API はさまざまな環境で使用できますが、その中にはAB(たとえば、A=Oracle、B=MySQL) があります。どのメソッドがどの環境でサポートされているかを伝えるために@Support、次のセマンティクスで注釈を追加しました。

  • 注釈がない@Supportということは、対応するメソッドが環境に依存しないことを意味します
  • 「空の」@Support注釈は、対応するメソッドがすべての環境でサポートされていることを意味します
  • パラメータ化@Supportされたアノテーションは、対応するメソッドがアノテーション引数として提供された環境でのみサポートされることを意味します。

この API クライアントとの通信を改善するために、API の前処理に使用できる Maven プラグインを作成したいと考えています。そのプラグインは、提供されたすべての環境でサポートされないすべてのメソッドを廃止するために、環境のリストをパラメーターとして受け取ります。

いくつかの例:

  • プラグインを次のように実行しENVIRONMENT_Aます。インターフェースに影響はありません。すべてのメソッドがサポートされていますENVIRONMENT_A
  • プラグインをENVIRONMENT_B次のように実行します。結果のインターフェイスは次のようになります

    public interface SomeInterface {
      void method1();
    
      @Support
      void method2();
    
      /* @deprecated - Not supported in ENVIRONMENT_B */
      @Support(ENVIRONMENT_A)
      @Deprecated
      void method3();
    
      @Support({ ENVIRONMENT_A, ENVIRONMENT_B })
      void method4();
    }
    
  • ENVIRONMENT_Aと の両方でプラグインを実行しますENVIRONMENT_B

    public interface SomeInterface {
      void method1();
    
      @Support
      void method2();
    
      /* @deprecated - Not supported in both ENVIRONMENT_A *AND* ENVIRONMENT_B */
      @Support(ENVIRONMENT_A)
      @Deprecated
      void method3();
    
      @Support({ ENVIRONMENT_A, ENVIRONMENT_B })
      void method4();
    }
    

つまり、プラグインは、src/main/java のソースをコンパイルする前に、上記のルールに従って src/main/java のすべてのソースを変換する必要があります。これをいつでも再現できるようにするには、元のソースをそのままにしておく必要があります。これは可能ですか?

4

1 に答える 1

0

Mavenビルドの一部としてソースコードを前処理することは答えのように思えますが、多くの詳細を無視するため、実際にはそうではありません:

  1. Maven はビルド中に外部ツールを呼び出すことができますが、ソースを処理するためのツールが必要です。
  2. のファイルから Maven Java コンパイラをどのように遠ざける予定src/*/javaですか? 正しくない場合は、元のソースと変換されたソースの両方をコンパイルしようとします。
  3. 元のソースをどのように編集する予定ですか? 元のソースを別のフォルダーに移動すると、m2e などのツールは、POM を読み取ってパスを決定するため、たとえば Eclipse でそれらを編集できなくなります。
  4. コードを見ている開発者は、Maven に慣れているため、かなり混乱するでしょう。Maven は、「src/*/java のソースはコンパイルされ、アーティファクトになります」と述べています。したがって、あなたは慣習に違反しています。
于 2012-07-06T12:16:59.253 に答える