有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用gradle任务生成源代码,该任务基于带有注释的现有类

我正在创建springboot应用程序,大部分时间我都在为我的模型编写样板代码—存储库、服务、控制器、构建器。。。我不想那样做

根据我的经验、以前的工作和研究,我的脑海中形成了一个概念。基本上如下:

  1. 我创建了一个注释
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface CodeGenSubject {
}
  1. 我创建了一个处理器
public class MyProcessor extends AbstractProcessor {
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return Collections.singleton(CodeGenSubject.class.getCanonicalName());
    }

    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        for(Element e: roundEnvironment.getElementsAnnotatedWith(CodeGenSubject.class)){
            // Observe fields and methods with reflection API
            // "Write" some code with JavaPoet
            // Place the generated code to the src/java folder
            // (with javax.annotation.processing.Filer)
        }
    }
}
  1. 我编写特定于域的类
@CodeGenSubject
@Entity
public class MyDomainSpecificEntity {
    @Id
    private Long id;
    private String stuff;

    // getters and setters
}
  1. 最后,我创建了一个gradle任务(?)
task myCodeGeneratorTask(type: ???, group: "", desription: "") {
    // With this I am stuck
}

理想情况下,此模板生成器将是一个单独的模块

我看过一些示例项目(主要针对安卓),然后我发现最有希望的是:

https://www.baeldung.com/java-annotation-processing-builder

很好,但是。。。它使用maven,代码被放置在一个完全不可穿透的存储库中,并带有pom。根项目中的xml文件,只有几千行。谢谢:D

现在,我正在使用springboot应用程序开发一个示例多模块gradle项目。我有一个实体(MyDomainSpecificEntity),我正试图让gradle根据我的注释和处理器为我生成一些源代码

首先,如果我在概念上是错误的,最大的帮助是一些建议

第二,如果我不是,我会感谢一些帮助与格雷德尔脚本

最后。。。最好的例子是一个清理过的项目,如果有人玩过这个话题,并且有某种形式的公开回购,那将是最受欢迎的

谢谢


共 (1) 个答案

  1. # 1 楼答案

    实际上,我已经使用了这个概念,并且在github(gradle-boilerplate-generator-plugin)上有一个开源的gradle插件,可以生成样板文件

    它是一个通用插件,用于生成任何类型的样板文件(用户可以使用简单的YAML描述符、FreeMarker模板和gradle闭包配置来定义自己的样板文件,而不是使用您喜欢的带有注释的java类)。默认情况下,该插件附带一些演示样板

    实际上,其中一个演示样板包括(开箱即用)一个名为boilerplateWebServiceResource的任务,用于生成典型web服务资源所需的典型实体、DTO、Repo、控制器、资源等类

    Its documentation非常详细地介绍了如何使用、配置和扩展它(创建自定义样板文件)。它可能不是你想要的东西;但是你可以给我一些建议,问题,提出意见,修改意见,或者从中得到一些想法。希望这有帮助