【问题标题】:Generating XML Resources into Classpath using Annotation Processors使用注释处理器将 XML 资源生成到类路径中
【发布时间】:2017-03-08 16:52:35
【问题描述】:

我目前正在 Intellij 15.0.6 中处理 Gradle 3.3 项目。

我正在使用Gradle APT plugin 将注释处理器添加到我的类路径中。

它在生成 Java 类文件时工作正常,但是我需要能够在构建目录的生成目录中等效的 resources 目录中生成 XML 源代码。

这是我目前的构建目录结构:

Project Build Directory Image

如您所见,它不包含 resources 目录,我怀疑这可能是导致此问题的原因。

我通过./gradlew assemble 运行注释处理器时收到的当前异常是:java.lang.IllegalArgumentException: Resource creation not supported in location CLASS_PATH

我在注释处理器中用于生成 xml 文件的代码:

FileObject source = processingEnv.getFiler() .createResource(StandardLocation.CLASS_PATH, "", "ap-test-2.html");

注意:我只是使用了一个 HTML 扩展作为测试,XML 应该会产生相同的结果。

javax.tools.StandardLocation 也有其他输出位置:

SOURCE_OUTPUT 位置用于将 XML 放置在与生成的 Java 类相同的包中,在 src/apt/main 中。然而,这不是我想要的行为。我需要它们驻留在类路径中。

经过广泛研究,我没有发现在其他任何地方讨论过这个例外。

感谢任何帮助。感谢您阅读此问题。

【问题讨论】:

    标签: annotation-processing


    【解决方案1】:

    StandardLocation.CLASS_PATH 仅用于输入,不用于输出。唯一的输出位置是SOURCE_OUPUTbuild/generated/source/apt/… 文件夹)、CLASS_OUTPUT(标准 Gradle build/classes/…)和NATIVE_HEADER_OUPUT。见https://docs.oracle.com/javase/8/docs/api/javax/tools/StandardLocation.html

    JavaC 没有类与资源输出的概念,但是如果您在编译期间运行注释处理器,那么 CLASS_OUTPUT 应该可以工作(Gradle 应该将所有内容复制到最终目录/JAR 中)。见https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javac.html

    【讨论】:

    • 感谢您的回复。有趣的是,Intellij 将build 类路径文件分成两个目录:classesresources。在将位置更改为CLASS_OUTPUT 后,我的处理器将 HTML 添加到了classes 目录。我会进一步测试,然后告诉你我发现了什么。
    • Intellij 似乎将这两个目录合并在一起并将它们添加到类路径中,因此将位置设置为CLASS_OUTPUT 理论上应该可以工作。我将尝试让 MVP 与我的处理器一起工作,以验证是否是这种情况。
    猜你喜欢
    • 2016-03-22
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多