Не удалось загрузить класс ‘org.aspectj.bridge.MessageHandler » при запуске плагина gradle в приложении для Android

#android #gradle #aspectj

Вопрос:

Я использую aspectjtools и aspectjrt создаю библиотеку AOP для Android — Bernoulli. Библиотека работает так, как ожидалось.

Затем я решил создать свой собственный плагин, чтобы скрыть следующее от моего конечного пользователя —

 final def variants = project.android.applicationVariants
        
 variants.all { variant ->
        
       variant.javaCompile.doLast {
        
            String[] args = ["-showWeaveInfo",
                             "-1.5",
                             "-inpath", javaCompile.destinationDir.toString(),
                             "-aspectpath", javaCompile.classpath.asPath,
                             "-d", javaCompile.destinationDir.toString(),
                             "-classpath", javaCompile.classpath.asPath,
                             "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        
            new Main().run(args, new MessageHandler(true));
       }
}
 

Значение build.gradle плагина —

 plugins {
    id 'signing'
    id 'maven-publish'
    id 'kotlin'
}

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

dependencies {

    implementation gradleApi()
    implementation localGroovy()

    implementation 'com.android.tools.build:gradle:4.1.3'

    api 'org.aspectj:aspectjrt:1.9.6'
    api 'org.aspectj:aspectjtools:1.9.6'
}

task sourceJar(type: Jar) {

    classifier = 'sources'
    from sourceSets.main.allSource
}

publishing {
    publications {

        "$project.name"(MavenPublication) {
           artifact "$buildDir/libs/$project.name-"   ARTIFACT_VERSION_NAME   ".jar"
        }
    }
}
 

Код компилируется, создается jar, и я могу опубликовать его mavenLocal .

Затем, когда я использую его в своем новом проекте, он может обнаружить плагин и не выдает ошибок сборки. Вот build.gradle описание проекта —

 plugins {
    id 'com.android.application'
}

// being fetched from mavenLocal
apply plugin: 'com.yugankasharan.bernoulli'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }
}

dependencies {

   // some android dependencies
   
    // my Bernoulli library, being fetched from mavenCentral
    implementation 'com.yugankasharan.bernoulli:bernoulli:0.2.1'
}
 

But when I run it, I get this error —

 Unable to load class 'org.aspectj.bridge.MessageHandler'.

This is an unexpected error. Please file a bug containing the idea.log file.
 

My logging has told me that this is happening in the javaCompile.doLast section of my plugin code, and I am unable to understand why this should happen.

  1. I thought this could be linked with the Java version, but i’m explicitly using version 8 in all my projects and modules.
  2. I then thought this could be a Gradle issue but i’m using the latest (and same versions) in both my library and new project.

Since my library is properly working, but my plugin isn’t, I’m pretty sure I’ve messed up my plugin setup somewhere.