2012-07-07 70 views
3

我有一個佈局爲一個項目如下:你如何在Java註解處理器集成到Java插件

src/ 
    java 
    generated 

的src/java中包含那些使用JPA的元模型類JPA實體和查詢類生成hibernate metamodel annotation processor

將註釋處理合併到java插件中的最佳方式是什麼?

我目前已經定義了以下任務,但它對compileJava具有任務依賴性,因爲某些代碼依賴於由註釋處理器生成的類,所以這將失敗。

task processAnnotations(type: Compile) { 
    genDir = new File("${projectDir}/src/generated") 
    genDir.mkdirs() 
    source = ['src/java'] 
    classpath = sourceSets.test.compileClasspath 
    destinationDir = genDir 
    options.compilerArgs = ["-proc:only"] 
} 

回答

3

爲什麼processAnnotations取決於compileJava的原因是,你把前者任務的編譯類路徑上的測試編譯類路徑,測試編譯類路徑中包含編譯生產的代碼(即的compileJava輸出)。至於如何最好的解決手頭的問題,你不應該需要一個單獨的編譯任務。 Java編譯器可以調用註釋處理器,並一次編譯其生成的源代碼(以及原始源代碼)(請參閱Annotation Processing)。有一件事你需要做的就是把註解處理器的編譯類路徑上:

configurations { 
    hibernateAnnotationProcessor 
} 

dependencies { 
    hibernateAnnotationProcessor "org.hibernate: ..." 
} 

compileJava.compileClasspath += configurations.hibernateAnnotationProcessor 

(你不想註解處理器添加到compile配置,因爲那會被認爲是一個依賴)

從我所知道的情況來看,這就是它的全部(假設你使用的是JDK6或更高版本)。

+0

我走了一個單一的任務的路徑,但編譯時,我得到了一個無效的標誌-s錯誤。所以我把它作爲一個單獨的任務。但是你提供的信息幫助了很多。謝謝。 – 2012-07-09 11:39:43

+0

這部分爲我工作。我還必須使用類似這樣的方式告訴編譯器我的處理器:'compileJava.options.compilerArgs = [「-processor」,「fully.qualified.processor.path.MyProcessor」]' – 2013-01-10 20:44:21

5

這裏是簡單的設置,可以與netbeans無縫地工作和集成。 Javac將基本完成所有需要的工作,而不需要太多幹預。剩下的就是一些小小的改動,可以使它像Netbeans這樣的IDE一起工作。

apply plugin:'java' 

dependencies { 
    // Compile-time dependencies should contain annotation processors 
    compile(group: 'org.hibernate...', name: '...', version: '...') 
} 

ext { 
    generatedSourcesDir = file("${buildDir}/generated-sources/javac/main/java") 
} 

// This section is the key to IDE integration. 
// IDE will look for source files in both in both 
// 
// * src/main/java 
// * build/generated-sources/javac/main/java 
// 
sourceSets { 
    main { 
     java { 
      srcDir 'src/main/java' 
      srcDir generatedSourcesDir 
     } 
    } 
} 

// These are the only modifications to build process that are required. 
compileJava { 
    doFirst { 
     // Directory should exists before compilation started. 
     generatedSourcesDir.mkdirs() 
    } 
    options.compilerArgs += ['-s', generatedSourcesDir] 
} 

就是這樣。 Javac將完成剩下的工作。