Не удается импортировать библиотеку AAR с аннотациями @IntDef

У меня есть следующий код в моей библиотеке:

@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;
}

В граде для библиотеки у меня

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 и support-annotations из библиотечной зависимости, но я все равно не могу выполнить сборку:

Ошибка: не удалось разрешить: annotationProcessor

Сейчас я застрял, много чего перепробовал но ничего не помогает. Я не могу построить основной проект с этой библиотекой. Нужно ли реализовывать какой-либо пользовательский AnnotationProcessor, чтобы иметь возможность использовать @IntDef's?

3 ответа

Решение

И вот наконец я смог преодолеть эту проблему!

Похоже, что в случае пользовательских аннотаций также требуется специальный процессор аннотаций. Сейчас я решил пропустить создание собственного процессора аннотаций и не использовать собственные аннотации для перечислений с @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/

Поискив эту проблему, похоже, что если в библиотеке есть какие-либо аннотации, библиотека нуждается в проекте аннотаций, который будет содержать их. Не уверен насчет процессора, но, надеюсь, он не понадобится, иначе мне придется переключаться с пользовательских аннотаций на @IntDef с некоторыми статическими финальными int вместо.

Для этого требуется некоторая магическая работа, и пока нет хороших учебников, но есть куча кода на github с процессорами и аннотациями. Я бы хотел не использовать пользовательский процессор, потому что он мне просто не нужен.

В любом случае, я постараюсь сохранить эту ветку обновленной, когда мне наконец удастся решить эту проблему.

Теперь история продолжается. Мне нужно было создать подмодуль аннотаций в проекте библиотеки для аннотаций, и мне пришлось убрать из него @IntDef, иначе он не смог бы импортировать какие-либо аннотации Android в подмодуль. Поэтому я переместил @IntDef в библиотеку, и теперь они используют собственные аннотации из субмодуля.

Несмотря на то, что я могу собрать и развернуть его, артефакт библиотеки не может быть импортирован, потому что:

Ошибка: не удалось найти com.kvolkov.animatedprogressviews: аннотации: не указано. Поиск в следующих местах: Требуется: project: > com.kvolkov.animatedprogressviews:library:1.0-RC5

Я предполагаю, что это происходит потому, что мне нужно развернуть субмодуль аннотаций в качестве отдельного артефакта, чего я не могу сделать, поскольку я не смог сопоставить код из некоторого учебника для модуля.gradle of annotations с плагинами для bintray для его развертывания там из студии...

Ну, это еще не конец. Если any1 заинтересован или готов помочь, вы можете взглянуть на текущий код библиотеки здесь: https://github.com/vulko/AnimatedArcProgressView

Я был бы рад получить некоторую помощь или совет, потому что вся информация, касающаяся этого, использует apt вместо процессора аннотаций.

Другие вопросы по тегам