如何在Gradle项目中使AspectJ Aspect工作?

FK

我正在使用以下示例代码来了解AspectJ:

public class Account {
    int balance = 20;

    public boolean withdraw(int amount) {
        if (balance < amount) {
            return false;
        }
        balance = balance - amount;
        return true;
    }

    public static void main(String[] args) {
        Account acc = new Account();
        acc.withdraw(5);

        Account acc2 = new Account();
        acc2.withdraw(25);
    }
}

以及以下方面:

public aspect AccountAspect {

    pointcut callWithDraw(int amount, Account acc) :
            call(boolean Account.withdraw(int)) && args(amount) && target(acc);

    before(int amount, Account acc) : callWithDraw(amount, acc) {
        System.out.printf("[before] withDraw, current balance %d%n", acc.balance);
    }

    boolean around(int amount, Account acc) : callWithDraw(amount, acc) {
        if (acc.balance < amount) {
            System.out.println("[around] withDraw, check failed");
            return false;
        }
        System.out.println("[around] withDraw, check success");
        return proceed(amount, acc);
    }

    after(int amount, Account acc) : callWithDraw(amount, acc) {
        System.out.printf("[after] withDraw, current balance %d%n", acc.balance);
    }
}

我正在使用以下Gradle构建文件:

plugins {
    id 'java'
    id "io.freefair.aspectj.post-compile-weaving" version "4.1.4"
}

configurations {
    ajc
    aspects
    aspectCompile
    compile{
        extendsFrom aspects
    }
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.4'
    implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.4'
    implementation group: 'org.codehaus.mojo', name: 'aspectj-maven-plugin', version: '1.8'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
compileJava {
    sourceCompatibility = "1.8"
    targetCompatibility = "1.8"
    //The following two lines are useful if you have queryDSL if not ignore
    dependsOn configurations.ajc.getTaskDependencyFromProjectDependency(true, "compileJava")
}

我正在Intellij中使用Ajc编译器来编译Java类和方面。此外,我正在设置以下虚拟机选项:

-javaagent:c:\\Users\\dev\\extlibs\\aspectjweaver-1.9.6.jar

代码可以编译并运行,没有任何问题,但是方面永远不会触发。我不确定我的配置中缺少什么,但是在使用AspectJ时我找不到其他可以做的事情。如果我使用@Aspect批注并在META-INF / aop.xml中注册带注释的方面,则该方面可以运行,但带注释的@Aspect Java类不允许创建需要捕获/拦截私有方法的特权方面。有关如何解决此问题的任何建议?

克里加克斯

您在其中混合了很多东西:

  • Freefair编译后编织插件:这是不必要的,因为您拥有Java源代码,并且可以使用常规编译时编织将其与方面一起进行编译。
  • AspectJ Maven插件:这是没有用的,因为您不能简单地在Gradle中使用Maven插件。
  • AspectJ加载时编织Java代理:这是不必要的,因为正如我所说,您可以在此处使用常规的编译时编织。如果不使用,则也不需要aop.xml-javaagent:

我猜您可以使用所有三个选项,即编译时,后编译时和加载时编织,但是您应该决定选择哪一个而不要混合使用。您还应该决定是否要使用Gradle或Maven,也不要尝试将它们混合使用。

这是编译时编织的工作方式:

  1. 将应用程序代码和方面代码都放在directory中src/main/aspectj
  2. 将您的Gradle构建文件简化为:
plugins {
  id "java"
  id "io.freefair.aspectj" version "5.1.1"
}

group "org.example"
version "1.0-SNAPSHOT"

repositories {
  mavenCentral()
}

dependencies {
  implementation "org.aspectj:aspectjrt:1.9.6"
}
  1. 现在,当从我的IDE运行主类时,我看到类似以下内容:
> Task :compileJava NO-SOURCE
> Task :compileAspectj UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE

> Task :Account.main()
[before] withDraw, current balance 20
[around] withDraw, check success
[after] withDraw, current balance 15
[before] withDraw, current balance 20
[around] withDraw, check failed
[after] withDraw, current balance 20

当然,如果要将该方面库重新用于多个应用程序或模块,或者如果该应用程序源代码不是用Java编写的(例如,用Kotlin, Groovy或Scala),因此无法由AspectJ编译器直接编译。不过,我不在这里讨论这个问题,因为我想向您展示最简单的解决方案,因为您似乎是一个初学者。(顺便说一句,我也不是Gradle用户,我通常在Maven中使用AspectJ。)


更新:插件文档确实很糟糕,但是您可以在维护者的GitHub存储库中看到一些示例项目

  • 方面:编译时编织,即一个模块中的应用程序+方面,如我的答案所示
  • httpcore-nio:编译后编织到第3方库中
  • 测试:如何测试方面
  • 编织: Java,Groovy和Lombok中的混合语言方面,以及如何在单个模块中一起使用它们

所有这些都可以使用Maven和AspectJ Maven插件来完成,但是您特别要求Gradle。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Gradle项目中使AspectJ Aspect工作?

来自分类Dev

如何让 Aspect 在 Pojo 中的所有 getter 上工作

来自分类Dev

如何在Bower项目中包含javascript并使JSHint工作

来自分类Dev

Maven项目中的AspectJ,无法正常工作/编织

来自分类Dev

如何在Gradle项目中使用GWT快照构建?

来自分类Dev

如何使导航在我的 UWP 项目中工作?

来自分类Dev

如何在旧的大型综合维修项目中提高工作效率

来自分类Dev

多个开发人员如何在一个Moodle项目中工作?

来自分类Dev

如何在Gradle子项目中使用Gradle Artifactory插件

来自分类Dev

如何在Gradle子项目中使用Gradle Artifactory插件

来自分类Dev

如何在Maven项目中将AspectJ用于Loggin?

来自分类Dev

如何在gradle项目中添加JAR?

来自分类Dev

如何在项目中重用 gradle 定义

来自分类Dev

如何在项目中使用Printf

来自分类Dev

如何在Gradle项目中使用带有Profiled注释的Perf4J?

来自分类Dev

如何在Gradle项目中使用Oracle JDBC驱动程序

来自分类Dev

如何在不基于gradle构建的android项目中使用ShowcaseView库?

来自分类Dev

如何在另一个Eclipse工作区中创建的项目中使用另一个程序包中一个程序包的类

来自分类Dev

如何在我的Gradle项目中包含同级项目?

来自分类Dev

如何在Android Gradle项目中更改项目构建目标

来自分类Dev

如何在ffmpeg中使用pad的aspect参数?

来自分类Dev

如何在Eclipse / Java中的同一工作区中引用另一个项目中的类

来自分类Dev

CocoaPods的install命令如何在后台工作,以将文件添加到我的Xcode项目中?

来自分类Dev

如何使ServiceStack在MVC4项目中工作?

来自分类Dev

如何从AngularDart Gallery获取MaterialDropdownSelectSimpleDemoComponent以在简单的AngularDart项目中工作

来自分类Dev

如何使ServiceStack在MVC4项目中工作?

来自分类Dev

当包含在xCode项目中时,SDK /框架如何工作?

来自分类Dev

如何在不同的java项目中使用java项目?

来自分类Dev

如何使用Gradle在我的Android项目中使用库?

Related 相关文章

  1. 1

    如何在Gradle项目中使AspectJ Aspect工作?

  2. 2

    如何让 Aspect 在 Pojo 中的所有 getter 上工作

  3. 3

    如何在Bower项目中包含javascript并使JSHint工作

  4. 4

    Maven项目中的AspectJ,无法正常工作/编织

  5. 5

    如何在Gradle项目中使用GWT快照构建?

  6. 6

    如何使导航在我的 UWP 项目中工作?

  7. 7

    如何在旧的大型综合维修项目中提高工作效率

  8. 8

    多个开发人员如何在一个Moodle项目中工作?

  9. 9

    如何在Gradle子项目中使用Gradle Artifactory插件

  10. 10

    如何在Gradle子项目中使用Gradle Artifactory插件

  11. 11

    如何在Maven项目中将AspectJ用于Loggin?

  12. 12

    如何在gradle项目中添加JAR?

  13. 13

    如何在项目中重用 gradle 定义

  14. 14

    如何在项目中使用Printf

  15. 15

    如何在Gradle项目中使用带有Profiled注释的Perf4J?

  16. 16

    如何在Gradle项目中使用Oracle JDBC驱动程序

  17. 17

    如何在不基于gradle构建的android项目中使用ShowcaseView库?

  18. 18

    如何在另一个Eclipse工作区中创建的项目中使用另一个程序包中一个程序包的类

  19. 19

    如何在我的Gradle项目中包含同级项目?

  20. 20

    如何在Android Gradle项目中更改项目构建目标

  21. 21

    如何在ffmpeg中使用pad的aspect参数?

  22. 22

    如何在Eclipse / Java中的同一工作区中引用另一个项目中的类

  23. 23

    CocoaPods的install命令如何在后台工作,以将文件添加到我的Xcode项目中?

  24. 24

    如何使ServiceStack在MVC4项目中工作?

  25. 25

    如何从AngularDart Gallery获取MaterialDropdownSelectSimpleDemoComponent以在简单的AngularDart项目中工作

  26. 26

    如何使ServiceStack在MVC4项目中工作?

  27. 27

    当包含在xCode项目中时,SDK /框架如何工作?

  28. 28

    如何在不同的java项目中使用java项目?

  29. 29

    如何使用Gradle在我的Android项目中使用库?

热门标签

归档