Невозможно загрузить класс com.squareup.javapoet.TypeName. - PullRequest
0 голосов
/ 16 января 2019

Я создал процессор аннотаций в виде библиотеки Java, который зависит от модуля Android, в котором есть аннотация. Это работает нормально, если я просто импортирую модуль и импортирую код в любой проект Android, над которым я работаю. Проблема возникает, когда я на самом деле собрал jar-файл компилятора и импортировал его в свой проект Android. Как только я делаю это и пытаюсь построить проект, я получаю сообщение об ошибке

Невозможно загрузить класс 'com.squareup.javapoet.TypeName'

Первоначально я следовал онлайн-уроку о том, как создать процессор аннотаций для Android, и в нем говорилось о создании 2 разных модулей в проекте, один как модуль Java, а другой как библиотека Android, затем в компиляторе добавьте в библиотека android как зависимость в файле build.gradle, так что я сделал это. Вот файл компилятора build.gradle ...

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':annotations')

    implementation 'com.squareup:javapoet:1.9.0'
    implementation 'com.google.guava:guava:24.1-jre'
    implementation 'com.google.auto.service:auto-service:1.0-rc2'
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

А вот и аннотация ...

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

Код аннотации очень прост ...

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @Interface Challenge {
  int position() default 0;
}

Компилятор намного сложнее. Он расширяет AbstractProcessor и использует AutoService для прохождения кода и поиска всего с помощью аннотации @Challenge, а затем использует имена этих классов для создания нового класса, который позволяет приложению получать доступ к вызовам через статические методы.

Все это прекрасно работало, пока я не попытался собрать компилятор и использовать полученный файл jar в проекте Android. Теперь он не может загрузить тот класс, который должен использовать компилятор. Проект, в котором я его использую, объявлен в файле settings.gradle примерно так ...

include ': app', ': compiler'

и в файле build.gradle у меня в зависимостях ...

implementation 'com.squareup.javapoet:1.9.0'
implementation 'com.google.guava:guava:24.1-jre'
implementation 'com.google.auto.service:auto-service:1.0-rc2'
annotationProcessor project(':compiler')
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc2'

Независимо от того, что я делаю, используя его в качестве jar-файла, я получаю ту же ошибку, но если я просто импортирую модуль как код, а не как jar-файл, он отлично работает. Я также попытался создать аннотацию в виде jar-файла и включить ее в проект, но это не помогает. Я искал и искал и не могу понять, почему он потерпит неудачу как баночка, а работает просто как код. Странно то, что я нигде не могу найти ни одного моего экземпляра, использующего TypeName в моем коде. Я сделал поиск по пути, и единственное, что даже близко к нему, - это использование ParameterizedTypeName.get (...). Поэтому я не знаю, почему TypeName может вызвать проблему.

...