upgrading AspectJ + Spring + Gradle



我正在尝试将 AspectJ jar 从 1.8.1 升级到 1.8.5,但我的构建一直失败并出现以下错误:

[ant:iajc] [error] javax.annotation.processing.FilerException: createResource. Resource already created

更新前构建很好。我尝试从 1.8.1 升级到 1.8.2 再次升级,但也失败了。这是我的build.gradle的一个片段

ext.aspectjCompiler = {
    ant.taskdef(
            resource: 'org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties',
            classpath: configurations.ajc.asPath
            )
    ant.iajc(
            source: sourceCompatibility,
            target: targetCompatibility,
            destDir: sourceSets.main.output.classesDir.absolutePath,
            maxmem: '512m',
            fork: 'true',
            aspectPath: configurations.aspects.asPath,
            sourceRootCopyFilter:'**/*.java',
            classpath: "${configurations.compile.asPath};${configurations.aspectCompile.asPath}",
            Xlint: 'ignore'
            ){
                sourceroots {
                    sourceSets.main.java.srcDirs.each { srcDir ->
                        pathelement(location: srcDir.absolutePath)
                    }
                }
            }
}
compileJava {
    doLast aspectjCompiler
}

从AspectJ 1.8.2开始,AspectJ编译器ajc支持注释处理。AspectJ维护者Andy Clement在一篇博客文章中也描述了这一点。可能这在某种程度上妨碍了您项目中的其他 APT 内容。

不幸的是,ajc 的命令行界面没有提及或解释新参数(仅在错误使用时显示错误消息),但基本上有三个:-proc-processor-processorpath 。在源代码中搜索,您甚至可以找到一些内联文档:

来自AjcTask.java:

  /**
   * Controls whether annotation processing and/or compilation is done.
   * -proc:none means that compilation takes place without annotation processing.
   * -proc:only means that only annotation processing is done, without any subsequent compilation.
   */
  public void setProc(String proc) {
    if (proc.equals("none")) {
      cmd.addFlag("-proc:none", true);
    } else if (proc.equals("only")) {
      cmd.addFlag("-proc:only", true);
    }
  }
  /**
   * -processor class1[,class2,class3...]
   *  Names of the annotation processors to run. This bypasses the default discovery process.
   */
  public void setProcessor(String processors) {
    cmd.addFlagged("-processor", processors);
  }
  /**
   * -processorpath path
   * Specify where to find annotation processors; if this option is not used, the class path will be searched for processors.
   */
  public void setProcessorpath(String processorpath) {
    cmd.addFlagged("-processorpath", processorpath);
  }

来自AjcTaskTest.java的一些测试代码:

  public void testAptProc() {
    AjcTask task = getTask(NOFILE);
    task.setProc("none");
    checkContains(task.makeCommand(), "-proc:none", true);
    task.setProc("only");
    checkContains(task.makeCommand(), "-proc:only", true);
  }
  public void testAptProcessor() {
    AjcTask task = getTask(NOFILE);
    task.setProcessor("some.SomeClass");
    checkContains(task.makeCommand(), "-processor", true);
    checkContains(task.makeCommand(), "some.SomeClass", true);
  }
  public void testAptProcessorpath() {
    AjcTask task = getTask(NOFILE);
    task.setProcessorpath("some/path");
    checkContains(task.makeCommand(), "-processorpath", true);
    checkContains(task.makeCommand(), "some/path", true);
  }
  public void testAptGeneratedDirectory() {
    AjcTask task = getTask(NOFILE);
    task.setS("some/path");
    checkContains(task.makeCommand(), "-s", true);
    checkContains(task.makeCommand(), "some/path", true);
  }

因此,也许您想在调用 ajc 时在 Ant 作业中使用-proc:none,以便在另一个构建步骤中摆脱使用 APT 的方式。另一种选择是配置 ajc,以便它为您执行注释处理,而不是其他 APT 构建步骤。

最新更新