2012-07-05 25 views
0

我有以下的示例的源代碼來構建例如,A = Oracle,B = MySQL)。爲了進行通信,其方法被支撐在該環境中,我已經添加@Support註解與以下語義:使用Maven預處理源代碼,以與Maven

  • @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_AENVIRONMENT_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中的源代碼。原始來源應保持不變,以便隨時可重複使用。這可能嗎?

+1

[預處理源代碼作爲maven構建的一部分]的可能重複(http://stackoverflow.com/questions/187550/preprocessing-source-code-as-a-part-of-a-maven -build) – 2012-07-05 16:44:14

+1

...好吧,爲什麼我不只是谷歌...? http://stackoverflow.com/questions/187550/preprocessing-source-code-as-a-part-of-a-maven-build – 2012-07-05 16:44:32

回答

0

Preprocessing source code as a part of a maven build似乎是一個答案,但它真的不是,因爲它忽略了很多細節:

  1. Maven可以在生成過程中調用外部工具,但你仍然需要一個工具來處理你的源代碼。
  2. 您打算如何讓Maven Java編譯器遠離src/*/java中的文件?如果你做得不對,它會嘗試編譯原始源代碼和轉換源代碼。
  3. 您打算如何編輯原始來源?如果將原始源移動到不同的文件夾,像m2e這樣的工具將阻止您在Eclipse中編輯它們,因爲它們會讀取您的POM以確定路徑。
  4. 查看代碼的開發人員會很困惑,因爲他們習慣於Maven和Maven說:「src/*/java中的源代碼將被編譯並最終出現在工件中」。所以你違反了慣例。