ivt*_*oto 5 java android annotations annotation-processing android-gradle-plugin
我有一个包含 2 个模块的 Android Studio 项目:A 和 B。(这里不包括注释处理器和注释模块)
B 取决于 A。
B 是 Android 库模块,A 是简单的 Java 库模块。我的模块 B 上还有一个注释处理器。
我面临的问题是:
我想根据放置在两个模块- A 和 B 中的注释文件生成一些代码。问题来自注释处理器的工作方式 - 仅适用于源代码文件 *.java - 不适用于已编译的 *.class 文件。不幸的是,在 B 的编译过程中,注释处理器无法访问 A 中的那些源文件...
我能够想到的唯一一件事是,作为一种解决方案,即使是一个丑陋的解决方案,是将模块 A 中带注释的类的文件夹作为源集包含到模块 B 中。这样我就可以让模块 B 访问这些模块编译期间的文件。
sourceSets {
main {
java {
srcDirs = ['src/main/java', '../module_A/src/main/java/path/to/annotated/classes/folder']
}
}
}
Run Code Online (Sandbox Code Playgroud)
这解决了问题 - 现在注释处理器可以访问两个模块中的所有注释类,但是......
不幸的是,它引入了另一个问题......模块 A 中的那些带注释的类现在被编译了两次。它们包含在模块 A 的 JAR 文件和模块 B 的 AAR 文件中。
问题 1:是否有另一种方法可以从 B 上运行的注释处理器访问模块 A 的源文件???(据我所知,答案是否定的,但检查......)
问题2:如何从模块B的AAR最终包中排除那些编译文件(重复的文件)?
问题 3:也许...这是一个绝对错误的方法?有什么建议么?
提前致谢!
不,仅使用 API 无法实现您想要的目标java.lang.model
。至少不是没有一些额外的技巧。
问题不在于二进制与源代码。注释处理器可以使用Elements#getTypeElement来交互编译的类以及源定义的类:
\n\nElements elementUtil = processingEnvironment.getElementUtils();\nTypeElement integerClass = elementUtil.getTypeElement("java.lang.Integer");\nTypeElement myClass = elementUtil.getTypeElement("currently.compiled.Class");\n
Run Code Online (Sandbox Code Playgroud)\n\n但是您仍然需要在编译类路径上有类才能观察它,并且该类必须正在编译过程中才能对getElementsAnnotatedWith
.
您可以使用像FastClasspathScanner这样的工具来解决以后的限制:它将使用它自己的机制在编译的字节码中查找注释,并在编译过程中单独向您报告它们。但是您无法解决类路径问题:如果编译类路径中没有某些依赖项,则无法对其进行处理。因此,您必须将模块 \xe2\x80\x94 一起编译,方法是将它们合并为一个(就像您所做的那样)或通过声明一个模块依赖于另一个模块。在以后的情况下你可能无法使用getElementsAnnotatedWith
,但是getTypeElement
FastClasspathScanner 可以工作。
归档时间: |
|
查看次数: |
2074 次 |
最近记录: |