你們都知道java的註解(Annotation) 包含了運行時註解和編譯時註解。
運行時註解的例子:java
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface InjectView { int id() default 0; }
編譯時註解的例子:框架
@Target(ElementType.FIELD) @Retention(RetentionPolicy.CLASS) public @interface InjectView { int id() default 0; }
他們之間的區別是RetentionPolicy不一樣。
在開發編譯時註解,咱們一般會寫一個compiler的java module。以我本身的框架爲例,有一個saf-injectview-compilersvg

屏幕快照 2016-12-18 上午11.30.03.png
今天要說的填坑是:這個compiler module在打成jar包,給其餘項目使用須要注意的事項。ui
下面是個人打包腳本spa
task buildInjectCompiler( type: Jar) {
archiveName = 'SAF-inject-compiler-'+VERSION_NAME+'.jar' //初始化資源路徑集
from baseCompilerPath, injectviewCompilerPath
//去除路徑集下部分的資源
exclude "**/BuildConfig.class"
exclude "**/Manifest.class"
exclude "**/R.class"
exclude "**/R\$*.class"
//只導入資源路徑集下的部分資源
include "cn/salesuite/**/*.class"
include "META-INF/services/javax.annotation.processing.Processor"
destinationDir = file('build/outputs/')
}
最爲重要的是這一句:.net
include "META-INF/services/javax.annotation.processing.Processor"
是必需要添加的,雖然咱們可能使用 Google 的 auto-service 庫能夠自動生成 META-INF/services/javax.annotation.processing.Processor 文件,可是打包時必定要將這個文件打入jar包,不然沒法使用咱們的自定義註解。code
最後,咱們看一下完成以後compiler包的狀況,咱們已經把javax.annotation.processing.Processor文件打入jar包了。orm

屏幕快照 2016-12-18 上午11.58.38.png
本文同步分享在 博客「fengzhizi715」(JianShu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。blog