AspectJ не может найти суперкласс .raw

Фон

Проект использует аспекты для ведения журнала. Подробности:

  • Java 11
  • AspectJ 1.9.4 (среда выполнения, инструменты, компилятор, плагин посткомпиляции и ткачества)
  • Mockito Core 2.25.1

Файл build.gradle имеет вид:

apply plugin: "io.freefair.aspectj.post-compile-weaving"

dependencies {
    compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
    compileOnly group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.12.1'
    compileOnly group: 'org.osgi', name: 'org.osgi.framework', version: '1.9.0'
    compileOnly group: 'org.mockito', name: 'mockito-core', version: '2.25.1'

    inpath project(":company.project.main")
}

Проблема

Когда приложение скомпилировано, AspectJ не может найти MockMethodDispatcher и сообщает об ошибке:

.../mockito-core-2.25.1.jar [error] can't determine superclass of missing type org.mockito.internal.creation.bytebuddy.inject.MockMethodDispatcher
when weaving type org.mockito.internal.creation.bytebuddy.MockMethodAdvice
when weaving classes 
when weaving 
when batch building BuildConfig[null] #Files=0 AopXmls=#0
 [Xlint:cantFindType]
(no source information available)
        [Xlint:cantFindType]
.../org.mockito/mockito-core/2.25.1/e8fa2864b65c0b6fbb20daa436a94853bcd17e5e/mockito-core-2.25.1.jar [warning] can't find type org.mockito.internal.creation.bytebuddy.inject.MockMethodDispatcher whilst determining signatures of call or execution join point for java.util.concurrent.Callable org.mockito.internal.creation.bytebuddy.MockMethodAdvice.handle(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]), this may cause a pointcut to fail to match at this join point 
when weaving type org.mockito.internal.creation.bytebuddy.MockMethodAdvice
when weaving classes 
when weaving 
when batch building BuildConfig[null] #Files=0 AopXmls=#0
 [Xlint:cantFindTypeAffectingJPMatch]

Я подозреваю, что это связано с тем, что файл хранится как файл .raw, а не как файл .class (в соответствии с проблемой 845):

1778 Mon Jul 08 13:47:02 PDT 2019 org/mockito/internal/creation/bytebuddy/inject/MockMethodDispatcher.raw

Вопрос

Как бы вы обновили файл Gradle, чтобы указать после компиляции- weaving, чтобы полностью игнорировать классы Weaving (или сканирование) Mockito?

Примечания

Из командной строки кажется, что плетение работает:

java -cp aspectjtools-1.9.4.jar:aspectjrt-1.9.4.jar org.aspectj.tools.ajc.Main \
-inpath application.jar \
-aspectpath ../aspects/build/classes/java/main \
-Xlint:warning \
-verbose \
-showWeaveInfo \
-log aop.log \
-outjar woven.jar

Хотя выходные классы в woven.jar должны быть введены в application.jar.

Дополнение

Примечание:

  • Обойти проблему путем добавления аннотации @Aspect к классу с аннотацией !within @Pointcut нецелесообразно. Настоятельно предпочел бы передать аргумент ajc через плагин.
  • Понижение cantFindType ошибки до предупреждения было бы удовлетворительным ответом, но не идеальным (застрял в синтаксисе), так как я бы хотел, чтобы другие cantFindType ошибки оставались ошибками.

Связанный

Попытки

При звонке compileJava следующим образом:

compileJava {
    ajc {
        enabled = true
        classpath = configurations.aspectj
        options {
            aspectpath = configurations.aspect
            compilerArgs = [""]
        }
    }
}

Gradle сообщает о следующей ошибке:

Невозможно установить значение доступного только для чтения свойства classpath для объекта типа io.freefair.gradle.plugins.aspectj.AjcAction.

С использованием:

compileJava {
  ajc {
    options {
      compilerArgs = [""]
    }
  }
}

Отчеты Gradle:

Не удалось найти параметры метода () для аргументов [...] объекта типа io.freefair.gradle.plugins.aspectj.AjcAction.

исходный код на главном сервере, кажется, предоставляет разные имена для его "настраиваемых вещей":

task.getInputs().property("ajcArgs", this.getOptions().getCompilerArgs())

person Dave Jarvis    schedule 01.10.2019    source источник


Ответы (1)


Заявленная зависимость транзитивна:

inpath project(":company.project.main")

Это передаст полный путь к классам среды выполнения :company.project.main (классы, созданные указанным проектом и всеми его зависимостями) в -inpath ajc. (См. Файл build/tmp/compileJava/ajc.options для подтверждения.)

Чтобы избежать включения советов во внешние классы, объявите нетранзитивную зависимость следующим образом:

inpath(project(":company.project.main")) { 
    transitive = false
}

В зависимости от ваших конкретных требований и структуры вашего проекта, возможно, лучше применить плагин io.freefair.aspectj.post-compile-weaving непосредственно к проекту :company.project.main.

person larsgrefer    schedule 02.10.2019