将AspectJ 1.8.1升级到1.9.8并与Gradle 7 + Java 11集成无法找到Aspectjrt.jar

问题描述 投票:0回答:1

我正在将基于 Java 8 的 spring 代码库(gradle 项目)升级到 Java 11。 该项目确实包含 AOP 代码(https://en.wikipedia.org/wiki/Aspect-oriented_programming)并且它依赖于这些依赖项

org.springframework:spring-aspects:4.3.27.RELEASE
org.aspectj:aspectjtools:1.8.1
org.aspectj:aspectjrt:1.8.1

升级到1.9.8后的上述依赖关系:

dependencies {
    ajc 'org.aspectj:aspectjtools:1.9.8'
    implementation 'javax.persistence:persistence-api:1.0'
    implementation 'org.aspectj:aspectjtools:1.9.8'
    implementation 'org.aspectj:aspectjrt:1.9.8'
    aspects 'javax.persistence:persistence-api:1.0'

    aspects "org.springframework:spring-aspects:${springVersion}"
    aspects "org.springframework:spring-tx:${springVersion}"
    aspects "org.springframework:spring-orm:${springVersion}"

根据以下文档,AspectJ 1.8.x 与 java 8+ 不兼容: https://github.com/eclipse-aspectj/aspectj/blob/master/docs/dist/doc/JavaVersionCompatibility.md

我们计划最终升级到 Java 17。 关于 AspectJ 1.9.8 及其支持的官方文档:https://htmlpreview.github.io/?https://github.com/kriegaex/org.aspectj/blob/4b9d86acd096e5ee9e108ff0a450c420c880b6ea/docs/dist/doc/README-198 .html

成功将 gradle 5 升级到 gradle 7 后,尝试运行

gradlew clean build
失败,出现以下错误:

> Task :compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/someDir/someService/src/main/java/someCode.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

[ant:iajc] [warning] couldn't find aspectjrt.jar on classpath, checked: /Library/Java/JavaVirtualMachines/jdk-11.0.14.jdk/Contents/Home/lib/jrt-fs.jar:/Users/user/.gradle/caches/modules-2/files-2.1/javax.persistence/persistence-api/1.0/5725f57873e05e068803e2bf9d5a8ea3740ffec5/persistence-api-1.0.jar:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aspects/5.3.19/a60d729e20daa34220b63be28d1b3cd20c1128e8/spring-aspects-5.3.19.jar:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/5.3.19/f0b442718e67000845e8662ea10f138d7c47a3ae/spring-tx-5.3.19.jar:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/5.3.19/963b297aed7a1f9252cf4d925e6178190448ec81/spring-orm-5.3.19.jar:/Users/user/.gradle/caches/modules-2/files-2.1/javax.persistence/persistence-api/1.0/5725f57873e05e068803e2bf9d5a8ea3740ffec5/persistence-api-1.0.jar:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aspects/5.3.19/a60d729e20daa34220b63be28d1b3cd20c1128e8/spring-aspects-5.3.19.jar:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/5.3.19/f0b442718e67000845e8662ea10f138d7c47a3ae/spring-tx-5.3.19.jar:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/5.3.19/963b297aed7a1f9252cf4d925e6178190448ec81/spring-orm-5.3.19.jar
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.DisposableBean
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.BeanFactoryAware
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.InitializingBean
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine superclass of missing type org.springframework.aop.interceptor.AsyncExecutionAspectSupport
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine superclass of missing type org.springframework.cache.interceptor.CacheAspectSupport
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.DisposableBean
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.BeanFactoryAware
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.InitializingBean
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] can't determine implemented interfaces of missing type org.springframework.beans.factory.DisposableBean
[ant:iajc] when batch building BuildConfig[null] #Files=180 AopXmls=#0
[ant:iajc]  [Xlint:cantFindType]
[ant:iajc]
[ant:iajc] [error] classpath error: unable to find org.aspectj.lang.JoinPoint (check that aspectjrt.jar is in your classpath)
[ant:iajc]
[ant:iajc]
[ant:iajc] 10 errors, 1 warning

我已经仔细检查并确认

aspectjrt.jar
存在于我的 home
.gradle
目录中:

/Users/user/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjrt/1.9.8/7a5d13787d5268d415055eba51024fb7348fc533/aspectjrt-1.9.8.jar

但是,由于某种原因,我现有的

build.gradle
文件似乎没有检查此目录....(我怀疑这是这里的根本原因)

我当前的build.gradle设置如下:

configurations.all {
    transitive = false
}

compileJava {
    doLast {
        ant.taskdef( resource:"org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties", classpath: configurations.ajc.asPath)
        ant.iajc(
                source:"1.11",
                target:"1.11",
                destDir:sourceSets.main.output.classesDirs.getAsPath(),
                maxmem:"512m", fork:"true",
                aspectPath:configurations.aspects.asPath,
                sourceRootCopyFilter:"**/*.java",
                classpath:"${configurations.compile.asPath}") {
                    sourceroots {
                        sourceSets.main.java.srcDirs.each {
                            srcDir ->
                            pathelement(location:srcDir.absolutePath)
                        }
                    }
        }
    }
}


configurations{
    ajc
    aspects
    aspectCompile
    compile {
        extendsFrom aspects
    }
}
....

task sourcesJar(type: Jar) {
    from sourceSets.main.allSource
    classifier = 'sources'
}

我已经在官方文档上检查了 AjcTask(iajc) 安装的所有详细信息,不幸的是这些步骤都是为 maven 项目编写的: https://eclipse.dev/aspectj/doc/next/devguide/printable.html#antTasks-install

如果有人碰巧知道解决此问题的链接/指南,将非常感谢分享!

java gradle ant build.gradle aspectj
1个回答
0
投票

我已经仔细检查并确认

aspectjrt.jar
存在于我的家
.gradle
目录中

嗯,这可能是真的,但显然它不在 Ant 任务的类路径上(添加换行符以限制水平滚动):

[ant:iajc] [warning] couldn't find aspectjrt.jar on classpath, checked
  /Library/Java/JavaVirtualMachines/jdk-11.0.14.jdk/Contents/Home/lib/jrt-fs.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/javax.persistence/persistence-api/1.0/5725f57873e05e068803e2bf9d5a8ea3740ffec5/persistence-api-1.0.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aspects/5.3.19/a60d729e20daa34220b63be28d1b3cd20c1128e8/spring-aspects-5.3.19.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/5.3.19/f0b442718e67000845e8662ea10f138d7c47a3ae/spring-tx-5.3.19.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/5.3.19/963b297aed7a1f9252cf4d925e6178190448ec81/spring-orm-5.3.19.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/javax.persistence/persistence-api/1.0/5725f57873e05e068803e2bf9d5a8ea3740ffec5/persistence-api-1.0.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aspects/5.3.19/a60d729e20daa34220b63be28d1b3cd20c1128e8/spring-aspects-5.3.19.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/5.3.19/f0b442718e67000845e8662ea10f138d7c47a3ae/spring-tx-5.3.19.jar
  /Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/5.3.19/963b297aed7a1f9252cf4d925e6178190448ec81/spring-orm-5.3.19.jar

解决这个问题,你应该没问题。

顺便说一句,为什么你使用 Gradle 中的古老 Ant 任务而不是像 Freefair 这样的东西?

© www.soinside.com 2019 - 2024. All rights reserved.