【问题标题】:upgrading AspectJ + Spring + Gradle升级 AspectJ + Spring + Gradle
【发布时间】:2017-01-14 21:20:36
【问题描述】:

我正在尝试将 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 的 sn-p

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
}

【问题讨论】:

  • 始终提供完整的堆栈跟踪,而不仅仅是错误消息。

标签: spring gradle java-8 aspectj


【解决方案1】:

由于AspectJ 1.8.2 AspectJ 编译器ajc 支持注释处理。 AspectJ 维护者 Andy Clement 在blog post 中也描述了这一点。可能这会以某种方式妨碍您项目中的其他 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 构建步骤。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 2012-07-18
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多