AspectJ找不到.raw超类



Background

项目使用方面进行日志记录。详情:

  • 爪哇 11
  • AspectJ 1.9.4(运行时、工具、编译器、编译后编织插件(
  • 莫米托核心 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 文件以指示编译后编织插件完全忽略编织(或扫描(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中。

补遗

注意:

  • 通过使用!within@Pointcut注释修饰@Aspect注释类来解决此问题是不可行的。强烈希望通过插件将参数传递给ajc
  • cantFindType从错误降级为警告将是一个令人满意的答案,但不理想(坚持语法(,因为我希望其他cantFindType错误保留为错误。

相关

  • Gradle 和 AspectJ - 避免在编译时编织我自己的包
  • 如何为 FreeFair AspectJ Gradle 插件设置"-aspectpath"?
  • AspectJ + Gradle 配置

尝试

调用compileJava时,如下所示:

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

Gradle 报告以下错误:

无法为io.freefair.gradle.plugins.aspectj.AjcAction类型的对象设置只读属性"类路径"的值。

用:

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

格拉德尔报告:

在类型为io.freefair.gradle.plugins.aspectj.AjcAction的对象上找不到参数的方法选项(( [...]

master上的源代码似乎为其"可配置的东西"公开了不同的名称:

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

声明的依赖项是可传递的:

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

这会将:company.project.main的完整运行时类路径(由所述项目及其所有依赖项生成的类(传递到 ajc 的-inpath中。(请参阅build/tmp/compileJava/ajc.options文件进行确认。

为了避免将建议编织到外部类中,请声明非传递依赖项,如下所示:

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

根据您的确切要求和项目结构,将io.freefair.aspectj.post-compile-weaving插件直接应用于:company.project.main项目可能是更好的方法。

补充上述答案(这对我帮助很大,谢谢!(,您还可以将此策略应用于外部依赖项中存在的传递依赖项,例如:

inpath('org.apache.kafka:kafka-streams:3.1.1') {
transitive = false
}

最新更新