0

我有以下示例源代码:

public interface SomeInterface {
  void method1();

  @Support
  void method2();

  @Support(ENVIRONMENT_A)
  void method3();

  @Support({ ENVIRONMENT_A, ENVIRONMENT_B })
  void method4();
}

上述 API 可以在各种环境中使用,其中AB(例如,A=Oracle,B=MySQL)。为了传达哪种环境支持哪种方法,我添加@Support了具有以下语义的注释:

  • @Support注解表示对应方法不依赖环境
  • “空”@Support注解表示所有环境都支持相应的方法
  • 参数化@Support注释意味着相应的方法仅在作为注释参数提供的环境中受支持。

为了改善与 API 客户端的这种通信,我想编写一个 Maven 插件,可用于 API 预处理。该插件将环境列表作为参数,以弃用所有提供的环境中不支持的所有方法。

一些例子:

  • 我运行插件ENVIRONMENT_A:对界面没有影响。所有方法都支持ENVIRONMENT_A
  • 我运行插件ENVIRONMENT_B:结果界面应该是这样的

    public interface SomeInterface {
      void method1();
    
      @Support
      void method2();
    
      /* @deprecated - Not supported in ENVIRONMENT_B */
      @Support(ENVIRONMENT_A)
      @Deprecated
      void method3();
    
      @Support({ ENVIRONMENT_A, ENVIRONMENT_B })
      void method4();
    }
    
  • ENVIRONMENT_A我同时使用和运行插件ENVIRONMENT_B

    public interface SomeInterface {
      void method1();
    
      @Support
      void method2();
    
      /* @deprecated - Not supported in both ENVIRONMENT_A *AND* ENVIRONMENT_B */
      @Support(ENVIRONMENT_A)
      @Deprecated
      void method3();
    
      @Support({ ENVIRONMENT_A, ENVIRONMENT_B })
      void method4();
    }
    

所以换句话说,该插件应该在编译 src/main/java 中的源代码之前,根据上述规则转换 src/main/java 中的所有源代码。原始来源应保持不变,以便随时重现。这可能吗?

4

1 回答 1

0

预处理源代码作为 maven 构建的一部分似乎是一个答案,但实际上不是,因为它忽略了很多细节:

  1. Maven 可以在构建期间调用外部工具,但您仍然需要一个工具来处理您的源代码。
  2. 您打算如何使 Maven Java 编译器远离src/*/java. 如果你不正确,它将尝试编译原始源代码和转换后的源代码。
  3. 您打算如何编辑原始资源?如果您将原始源代码移动到不同的文件夹,m2e 之类的工具将阻止您在 Eclipse 等中编辑它们,因为它们会读取您的 POM 以确定路径。
  4. 开发人员看着代码会很困惑,因为他们习惯了 Maven,而 Maven 说:“src/*/java 中的源代码将被编译并最终出现在工件中”。所以你违反了约定。
于 2012-07-06T12:16:59.253 回答