【发布时间】:2015-07-10 09:29:21
【问题描述】:
我有以下示例源代码:
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 中的所有源代码。原始来源应保持不变,以便随时重现。这可能吗?
【问题讨论】:
-
...好吧,我为什么不直接google一下...? stackoverflow.com/questions/187550/…
标签: java maven build preprocessor