当前位置: 首页 > 知识库问答 >
问题:

使用Gradle将方面编入项目后编译

范高刚
2023-03-14
    null

这些项目包括:

  • app.aspects-包含一个用@aspect注释的LogAspect类。
  • app.aspects.weaver-没有源文件,只有声明方面的依赖项和要编织的项目。
  • app.common-定义LogAspect中描述的切入点引用的@log注释。
  • app.program.main-要用LogAspect中描述的连接点编织的文件。

这里定义了与方面相关的构建文件。其思想是编织与应用程序是独立的,因此应用程序的公共类和主程序都不需要知道编织。相反,主程序只需要从公共包中引用@log,AJC将负责编织。

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

dependencies {
    // For the @Log annotation
    compileOnly project(':app.common')

    // The LogAspect's joinpoint references the Main Program
    compileOnly project(':app.program.main')

    // Logging dependency is also compiled, but not shown here
}
apply plugin: "io.freefair.aspectj.post-compile-weaving"

dependencies {
    compileOnly "org.aspectj:aspectjrt:1.9.4"

    // This should set the -aspectpath ?
    aspect project(":app.aspects")

    // This should set the -inpath ?
    inpath(project(":app.program.main")) {
        // Only weave within the project
        transitive = false
    }
}
package com.app.common.aspects;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE, ElementType.CONSTRUCTOR })
public @interface Log {
    boolean secure() default false;
}

主程序类似于:

package com.app.program.main;

import com.app.common.aspects.Log;

@Log
public class Program {

  /** This is the method to weave. */
  protected void run() throws InterruptedException, TimeoutException {
  }
}

日志记录方面类似于(参见相关问题中的代码):

@Aspect
public class LogAspect {

    // In the future this will target points annotated with @Log
    @Pointcut("execution(* com.app.program.main.Program.run(..))")
    public void loggedClass() {
    }

    @Around("loggedClass()")
    public Object log(final ProceedingJoinPoint joinPoint) throws Throwable {
      return log(joinPoint, false);
    }

    private Object log(final ProceedingJoinPoint joinPoint, boolean secure) throws Throwable {
      // See last year's code for the full listing
      log.info("\u21B7| {}{}#{}({})", indent, className, memberName, params);
    }
}

似乎正在编织,但却找不到建议:

要使用Gradle将logAspect编织成programrun()方法,需要更改什么?

ajc.options文件显示:

-inpath
.../app.aspects/build/classes/java/main
-classpath
.../.gradle/caches/modules-2/files-2.1/org.aspectj/...
-d
.../app.aspects/build/classes/java/main
-target
11
-source
11

令人不安的是,-AspectPath没有显示,而-InPath列出的是app.aspects而不是app.program.main

共有1个答案

晁文斌
2023-03-14

apps.aspectsapps.aspects.weaver合并到同一个项目中产生了:

“com.app.program.main.program”(program.java:396)类型中的连接点“method-execution(void com.app.program.main.program.run())”由“com.app.aspects.logaspect”(logaspect.class(from logaspect.java)“的around通知建议

虽然这解决了问题,但我不明白为什么logAspect需要在执行编织的同一个项目中。Gradle文件变为:

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

dependencies {
    compileOnly "org.aspectj:aspectjrt:1.9.4"
    compileOnly project(':app.common')
    compileOnly project(':app.program.main')

    compileOnly org_apache_logging_log4j__log4j_api

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

compileJava.ajc.options.compilerArgs += "-showWeaveInfo"
compileJava.ajc.options.compilerArgs += "-verbose"
 类似资料:
  • 我已经用Gradle创建了一个JavaFX应用程序,并希望将它及其所有依赖项和JRE导出到exe中,最好的方法是什么? 我尝试使用Gradle-launch4j提供的快速启动,但exe没有启动,而是在IDE中启动,当我从命令行运行时,我得到错误

  • 问题内容: 我正在尝试导入项目以通过编程方式使其黯然失色。我不想使用UI模式。 以下是我用于导入项目的代码: 我只得到project文件夹以及,文件和文件,但没有得到源文件夹等。 问题答案: 用 尝试这样的事情:

  • 我正在尝试使用gradle编译一个war文件以部署到JBoss 7.1 AS,但编译失败(找不到ServletContext)…… gradle.build.见下文 错误: /workspace/agile runner/src/main/Java/com/agile runner/web/config/agilerunnerapplicationinitializer . Java:20:找不到

  • 问题内容: 我设法使用maven2创建了我的项目结构。但是在使用mvn install编译我的项目时,-source 1.3不支持获取错误泛型 谷歌使用jdk1.5构建我的项目并添加了构建标签 但这是行不通的。 有什么提示吗? 问题答案: 将maven-compiler-plugin添加到您的构建中:

  • 问题内容: IntelliJ IDEA 2016.3添加了将构建/运行委托给Gradle的功能。 很明显,当委托选项启用时,Gradle会执行所有操作。 我的问题是,关闭此选项时,IntelliJ到底在做什么? 我问这个问题是因为我的Gradle文件中有自定义代码,并且在IntelliJ中构建时似乎未执行此代码。当我运行时,一切正常。 问题答案: IntelliJ有自己的构建系统,称为JPS,它使

  • 我是Gradle/AspectJ的新手,对此我有几个问题。我开发了一些库,将在其他项目中使用。我使用AspectJ实现了一些交叉逻辑,并且使用@Aspect创建了我的方面,而没有使用apectj特定的语言。这个lib是一个小框架,它提供了一些注释来使用它。我为我的类创建了单元测试。我知道要应用方面,我需要使用AspectJ编译器(“AJC”)编译类。在我的ide中,我使用option:-javaa