我有以下示例源代码:
public interface SomeInterface {
void method1();
@Support
void method2();
@Support(ENVIRONMENT_A)
void method3();
@Support({ ENVIRONMENT_A, ENVIRONMENT_B })
void method4();
}
上述 API 可以在各种环境中使用,其中A
和B
(例如,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 中的所有源代码。原始来源应保持不变,以便随时重现。这可能吗?