使用Maven预处理将使用Maven构建的源代码

时间:2012-07-05 16:43:14

标签: java maven build preprocessor

我有以下示例源代码:

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客户端的这种通信,我想编写一个可用于API预处理的Maven插件。该插件将环境列表作为参数,以便弃用所有提供的环境中不支持的所有方法。

一些例子:

  • 我使用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_AENVIRONMENT_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中的所有源代码。原始来源应保持不变,以便随时可以重现。这可能吗?

1 个答案:

答案 0 :(得分:0)

Preprocessing source code as a part of a maven build似乎是一个答案,但实际上并不是因为它忽略了很多细节:

  1. Maven可以在构建期间调用外部工具,但您仍需要一个工具来处理您的源。
  2. 您打算如何使Maven Java编译器远离src/*/java中的文件?如果你没有把它弄好,它将尝试编译原始源和转换后的源。
  3. 您打算如何编辑原始来源?如果将原始源移动到另一个文件夹,m2e等工具将阻止您在Eclipse中编辑它们,因为它们会读取您的POM以确定路径。
  4. 查看代码的开发人员会非常困惑,因为他们习惯使用Maven和Maven说:“src / * / java中的源代码将被编译并最终出现在工件中”。所以你违反了惯例。