Dav*_*lme 4 java annotations annotation-processing
我创建了一个 java 注释,将我的一些“服务”类标记为服务,然后编写了一个注释处理器来生成相应的 servicerequest 和 servicehandler 类。这是一个 GWT maven 项目,其中服务请求被发送到服务器到中央调度程序,由各种服务处理。
我的maven项目由一个父项目和5个子模块项目组成。
项目结构是这样的:
我的问题是这样的。
让注释处理器从一个项目(moodleWSAPI)读取和处理注释并在另一个项目(moodleGenerateServiceHandlers)中生成java源文件的规定方法是什么?
我似乎有很多注释处理器的例子为运行注释处理器的同一项目生成java源文件,但不为不同的项目生成java源文件。
我已经成功构建并测试了我的注释处理器,但我不知道如何让它在处理器运行的项目之外生成文件。目前它在moodleWSAPI中生成java源文件(这是错误的) 。我希望它处理moodleWSAPI中的源文件,然后在moodleGenerateServiceHandlers中输出新生成的源文件。
这是我必须创建实际的 java 源文件的代码片段..
public void createSourceFileFromTemplate(Template template, ClassSignature classSignature, VelocityContext context, Element element) {
PrintWriter pw = null;
try {
JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(classSignature.getFullName(), classSignature.getElement());
OutputStream fileStream = sourceFile.openOutputStream();
pw = new PrintWriter(fileStream);
template.merge(context, pw);
} catch (Exception e) {
e.printStackTrace();
if (element!=null) {
processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(),element);
} else {
processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage());
}
} finally {
if (pw!=null) {
pw.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意: ClassSignature 只是我用来捕获类的类名的自定义类。我使用 Velocity 作为模板引擎来生成实际的 java 源代码。
我在processingEnv.getFiler() 规范中没有看到任何允许我指定项目外部输出的内容。
我可以不使用processingEnv.getFiler().createSourceFile(..),而只使用简单的java文件IO构建java源文件。这很容易做到,但我正在尝试在线条内着色,可以这么说,并以规定的方式实现我的需求。有任何想法吗 ?
我认为没有任何特殊的 API 可以创建用于其他项目的文件。就处理器而言(甚至是一般的Java),不存在“项目”之类的东西——只有提供给编译器的输入和输出路径是已知的。
使用Filer和StandardLocation有助于处理器的可移植性,并避免担心开发环境的目录结构。如果处理器仅在这个单个项目中使用,那么这种可移植性并不是真正需要的,并且使用直接文件 io 应该没有坏处,因为您确切地知道模块的结构。
为了使这更惯用,您可以使用该选项将其他项目源目录的位置作为编译器选项传递给注释处理器-Akey[=value]。这至少会将有关其他项目结构的任何假设从代码中移出,并将维护这些路径的责任转移给构建工具。无论如何,Maven 最了解项目的结构,所以我认为这将是一个很好的解决方案。
| 归档时间: |
|
| 查看次数: |
1635 次 |
| 最近记录: |