2013-03-23 64 views
22

我需要編寫一些註記處理器。我發現this blog post其中提到了如何在一般設置和Eclipse中完成這些工作。將註記處理器與Gradle集成

但是,我正在使用IntelliJ IDEA和Gradle,並且如果有更好的(如在,不那麼繁瑣)的方法來做到這一點。我應該能夠編寫兩個註釋處理器和將要消耗他們在同一個項目和搖籃應該處理添加處理器類路徑,並在approrpiate用javac調用它們的代碼

  1. :我正在尋找階段。
  2. 如果以上是不可能的,我必須創建兩個單獨的項目,那麼至少應該可以將它們保留在同一個git存儲庫中。 Gradle應該能夠無縫處理構建。
  3. 如果兩者都不可能,我必須創建兩個獨立的git存儲庫,那麼至少Gradle應該無縫地處理鏈接的博客文章中提到的內容,而無需進一步手動干預。

我的git和Gradle技能是初級水平。我將不勝感激這項任務的任何幫助。謝謝。

+1

尋找選項1的解決方案。 – Avik 2014-10-31 08:51:01

回答

6

是的,可以將處理器移至單獨的模塊並從另一個模塊使用(請參閱下面的querydslapt)。

我會建議更換你實現自己的AbstractProcessor

,並使用它像:

dependencies { 
    .... 
    // put dependency to your module with processor inside 
    querydslapt "com.mysema.querydsl:querydsl-apt:$querydslVersion" 
} 

task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') { 
    source = sourceSets.main.java // input source set 
    classpath = configurations.compile + configurations.querydslapt // add processor module to classpath 
    // specify javac arguments 
    options.compilerArgs = [ 
      "-proc:only", 
      "-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor" // your processor here 
    ] 
    // specify output of generated code 
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next() 
} 

你可以找到完整的例子here

9

另一種解決方案(在我看來更清潔)可能應該有兩個subprojects,然後簡單地使包含註釋處理器的一個與主要依賴關係相關。因此,考慮兩個目錄與​​您的子項目:在你的項目的根coreannotation-processors,你還需要有一個settings.gradle文件有以下幾點:

include 'core' 
include 'annotation-processors' 

然後在覈心項目gradle這個文件:

dependencies { 
    compile project(':annotation-processors') 
} 

這應該做到這一點,你將不必處理自定義編譯任務及其類路徑。

+0

是的,你說得對。在我的例子中,「querydsl-apt」應該被某個子項目取代 – 2013-03-25 06:18:09

+3

'annotation-processors'必須包含引用你的處理器的文件src/main/resources/META-INF/services/javax.annotation.processing.Processor。 – FeelGood 2014-11-05 21:57:03

+0

只有'core'和'annotation-processors'不是庫本身的一部分時,這種方式纔會有效,因爲gradle仍然不支持遞歸包含(只能使用一個'settings.gradle')。 – 2015-10-11 10:36:57