首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ajc可以省略指定的@方面类并让spring处理它吗?

ajc可以省略指定的@方面类并让spring处理它吗?
EN

Stack Overflow用户
提问于 2019-07-18 16:21:43
回答 1查看 319关注 0票数 0

我的应用程序需要同时使用AspectjSpring AOP,Spring有时很方便,但是当我使用ajc编译器时,它会编译所有带有@Aspectj注释的文件。

我的问题是:我可以告诉ajc忽略特定的Aspectj文件,让Spring AOP处理aop作业吗?我尽力了,但没能弄清楚,所以需要帮助.tks前进!

我使用gradle来管理我的应用程序,并编写了一个带有集成ajc的gradle插件。

weaveClasses.dependsOn compileJava classes.dependsOn weaveClasses

我使用post编译方法。

这是我的gradle配置,我只发布了结构。

代码语言:javascript
复制
group 'com.test.api'
apply plugin: 'base'
apply plugin: 'maven-publish'
apply plugin: 'findbugs'

apply plugin: 'java'

sourceCompatibility = 1.8


ext {
    springBootVersion = '1.5.4.RELEASE'
    springVersion = '4.3.9.RELEASE'




    env = System.getProperty("env") == null ? "development" : System.getProperty("env")
}

buildscript {
    ext {
        springBootVersion = '1.5.3.RELEASE'
    }

    repositories {
        mavenLocal()
        jcenter()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
        classpath "com.test.tools:aspectj-post-compile:1.1.5"
    }
}

allprojects {
    apply plugin: 'java'

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    version '0.1.7'
    group 'com.test.api'

    apply plugin: 'maven-publish'
    publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java
            }
        }
    }
}


subprojects {
    apply plugin: 'idea'
    apply plugin: 'java'
    apply plugin: "aspectj.post.compile"

    version = parent.version
    group = parent.group

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    configurations {
        all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-logging"
        all*.exclude group: "org.slf4j", module: "slf4j-log4j12"
    }

    apply plugin: 'checkstyle'
    checkstyle {
        toolVersion = "7.6"
        ignoreFailures = true
        configFile file("${project.rootDir}/checkstyle/test-java.xml")
    }

    tasks.withType(Checkstyle) {
        reports {
            xml.enabled = false
            html.enabled = false
        }
    }

    repositories {
        mavenLocal()
        maven { url "http://maven-test.corp.yiran.com:8081/repository/maven-public/" }
        jcenter()
    }

    sourceSets {
        main {
            resources {
                srcDirs = ["src/main/resources/base", "src/main/resources/$env"]
            }
        }
        test {
            resources {
                srcDirs = ["src/test/resources/base", "src/test/resources/$env"]
            }
        }
    }



    [compileJava, compileTestJava]*.options.collect { options ->
        options.compilerArgs.add '-parameters'
    }
    weaveClasses.dependsOn compileJava
    classes.dependsOn weaveClasses
}



project(":geneva-contract") {
    jar.archiveName = "test-contract.jar"

    dependencies {
        compile "com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion"
        compile "org.projectlombok:lombok:$lombokVersion"
        compile "com.test.service:farmer-base:$farmerVersion"
        compile "com.test.api:daily-open-base:$dailyOpenVersion"

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-20 03:48:08

最简单的方法是将AspectJ和Spring方面放到不同的Maven/Gradle模块中,并且只使用AspectJ编译器构建AspectJ模块,然后将该模块放在要编织到的应用程序模块的方面路径上。

一种更复杂的方法是使用一个无文档的特性来编写编译时编织:

代码语言:javascript
复制
-xmlConfigured /path/to/my/aop-ctw.xml

还请参阅我的AspectJ票455014,并根据我的评论中的链接获得更多信息。

一个小小的例子:

代码语言:javascript
复制
package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {}
}
代码语言:javascript
复制
package de.scrum_master.aspect;

public aspect FirstAspect {
  before() : execution(* *(..)) {
    System.out.println(this.getClass().getSimpleName() + ": " + thisJoinPoint);
  }
}
代码语言:javascript
复制
package de.scrum_master.aspect;

public aspect SecondAspect {
  before() : execution(* *(..)) {
    System.out.println(this.getClass().getSimpleName() + ": " + thisJoinPoint);
  }
}

如果您正常地编译和运行这个程序,控制台日志会说:

代码语言:javascript
复制
FirstAspect: execution(void de.scrum_master.app.Application.main(String[]))
SecondAspect: execution(void de.scrum_master.app.Application.main(String[]))

但如果你添加这样的配置文件..。

代码语言:javascript
复制
<aspectj>
  <aspects>
    <aspect name="de.scrum_master.aspect.FirstAspect" />
  </aspects>
</aspectj>

..。然后从编译器命令行引用它,例如从安装了AJDT的Eclipse中引用,

..。控制台日志更改为:

代码语言:javascript
复制
FirstAspect: execution(void de.scrum_master.app.Application.main(String[]))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57098915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档