无法导入带有 @IntDef 注释的 AAR 库
Can't import AAR library with @IntDef annotations
我的库中有以下代码:
@Documented
@IntDef({OpacityAnimationType.NONE,
OpacityAnimationType.BLINKING,
OpacityAnimationType.SHINY,
OpacityAnimationType.AURA,
})
public @interface OpacityAnimationType {
int NONE = 0;
int BLINKING = 1;
int SHINY = 2;
int AURA = 3;
}
在 gradle 我有图书馆
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["library" : "true"]
}
}
}
}
和
configurations {
javadocDeps
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:appcompat-v7:$supportLibraryVersion"
compile "com.android.support:support-annotations:$supportLibraryVersion"
javadocDeps "com.android.support:support-annotations:$supportLibraryVersion"
}
我将其部署到 JFrog BinTray,然后尝试在我的应用程序中使用它。我必须从库依赖项中排除 appcompat-v7 和支持注释,但我构建仍然失败:
Error:Failed to resolve: annotationProcessor
现在我卡住了,尝试了很多方法但没有任何帮助。我无法用这个库构建主项目。
我是否需要实现任何自定义 AnnotationProcessor 才能使用 @IntDef?
一直在谷歌搜索这个问题,看起来如果库中有任何注释,库需要一个包含这些注释的项目。虽然不确定处理器,希望不需要它,否则我将不得不从自定义注释切换到 @IntDef 并使用一些静态最终 int。
执行此操作还需要一些 gradle 魔法,到目前为止还没有好的教程,但是 github 上有一堆带有处理器和注释的代码。我想避免使用自定义处理器,因为我根本不需要它。
无论如何,当我最终设法解决这个问题时,我会尽量保持这个帖子的更新。
故事还在继续。
我必须在库项目中创建一个 annotations 子模块用于注释,并且我必须将 @IntDef 移出它,否则它将无法导入任何 android子模块的注释。所以我将@IntDef 移到了库中,他们现在使用子模块中的自定义注释。
尽管我能够构建和部署它,但无法导入库工件,原因:
Error:Could not find
com.kvolkov.animatedprogressviews:annotations:unspecified. Searched in
the following locations: Required by:
project : > com.kvolkov.animatedprogressviews:library:1.0-RC5
我假设发生这种情况是因为我现在需要将 annotations 子模块部署为一个单独的工件,但我不能这样做,因为我无法匹配某些代码注释模块的 .gradle 教程,带有 bintray 插件,可从工作室将其部署到那里...
嗯,这还没有结束。
如果 any1 有兴趣或愿意提供帮助,您可以在此处查看库的当前代码:
https://github.com/vulko/AnimatedArcProgressView
我很高兴收到一些帮助或建议,因为所有相关信息都使用 apt 而不是注释处理器。
所以我终于克服了这个问题!
看起来在自定义注释的情况下还需要自定义注释处理器。现在我决定跳过创建自定义注释处理器,而不是使用自定义注释来枚举 @IntDef。
但是无论如何,如果您的库使用现有注释并且您将其发布在 mavenCentral 或 jCenter 或其他存储库上并在其他项目中使用它,那么您需要为 javadoc 任务添加一些魔法。
从这里开始:
https://github.com/vulko/AnimatedArcProgressView/blob/master/library/build.gradle 和
configurations {
javadocDeps
}
dependencies {
// ...
compile("com.android.support:support-annotations:$supportLibraryVersion") {
transitive false;
}
javadocDeps "com.android.support:support-annotations:$supportLibraryVersion"
}
然后继续在此处发布 gradle 脚本:https://github.com/vulko/AnimatedArcProgressView/blob/master/gradle/publish-library.gradle 以及:
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.source
// this is the magic
classpath += configurations.javadocDeps
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
无论如何,所有的代码都可以在这里找到:
https://github.com/vulko/AnimatedArcProgressView/
我的库中有以下代码:
@Documented
@IntDef({OpacityAnimationType.NONE,
OpacityAnimationType.BLINKING,
OpacityAnimationType.SHINY,
OpacityAnimationType.AURA,
})
public @interface OpacityAnimationType {
int NONE = 0;
int BLINKING = 1;
int SHINY = 2;
int AURA = 3;
}
在 gradle 我有图书馆
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["library" : "true"]
}
}
}
}
和
configurations {
javadocDeps
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:appcompat-v7:$supportLibraryVersion"
compile "com.android.support:support-annotations:$supportLibraryVersion"
javadocDeps "com.android.support:support-annotations:$supportLibraryVersion"
}
我将其部署到 JFrog BinTray,然后尝试在我的应用程序中使用它。我必须从库依赖项中排除 appcompat-v7 和支持注释,但我构建仍然失败:
Error:Failed to resolve: annotationProcessor
现在我卡住了,尝试了很多方法但没有任何帮助。我无法用这个库构建主项目。 我是否需要实现任何自定义 AnnotationProcessor 才能使用 @IntDef?
一直在谷歌搜索这个问题,看起来如果库中有任何注释,库需要一个包含这些注释的项目。虽然不确定处理器,希望不需要它,否则我将不得不从自定义注释切换到 @IntDef 并使用一些静态最终 int。
执行此操作还需要一些 gradle 魔法,到目前为止还没有好的教程,但是 github 上有一堆带有处理器和注释的代码。我想避免使用自定义处理器,因为我根本不需要它。
无论如何,当我最终设法解决这个问题时,我会尽量保持这个帖子的更新。
故事还在继续。 我必须在库项目中创建一个 annotations 子模块用于注释,并且我必须将 @IntDef 移出它,否则它将无法导入任何 android子模块的注释。所以我将@IntDef 移到了库中,他们现在使用子模块中的自定义注释。
尽管我能够构建和部署它,但无法导入库工件,原因:
Error:Could not find com.kvolkov.animatedprogressviews:annotations:unspecified. Searched in the following locations: Required by: project : > com.kvolkov.animatedprogressviews:library:1.0-RC5
我假设发生这种情况是因为我现在需要将 annotations 子模块部署为一个单独的工件,但我不能这样做,因为我无法匹配某些代码注释模块的 .gradle 教程,带有 bintray 插件,可从工作室将其部署到那里...
嗯,这还没有结束。 如果 any1 有兴趣或愿意提供帮助,您可以在此处查看库的当前代码: https://github.com/vulko/AnimatedArcProgressView
我很高兴收到一些帮助或建议,因为所有相关信息都使用 apt 而不是注释处理器。
所以我终于克服了这个问题!
看起来在自定义注释的情况下还需要自定义注释处理器。现在我决定跳过创建自定义注释处理器,而不是使用自定义注释来枚举 @IntDef。
但是无论如何,如果您的库使用现有注释并且您将其发布在 mavenCentral 或 jCenter 或其他存储库上并在其他项目中使用它,那么您需要为 javadoc 任务添加一些魔法。
从这里开始: https://github.com/vulko/AnimatedArcProgressView/blob/master/library/build.gradle 和
configurations {
javadocDeps
}
dependencies {
// ...
compile("com.android.support:support-annotations:$supportLibraryVersion") {
transitive false;
}
javadocDeps "com.android.support:support-annotations:$supportLibraryVersion"
}
然后继续在此处发布 gradle 脚本:https://github.com/vulko/AnimatedArcProgressView/blob/master/gradle/publish-library.gradle 以及:
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.source
// this is the magic
classpath += configurations.javadocDeps
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
无论如何,所有的代码都可以在这里找到: https://github.com/vulko/AnimatedArcProgressView/