Java 使用Maven预处理将使用Maven构建的源代码
我有以下示例源代码:Java 使用Maven预处理将使用Maven构建的源代码,java,maven,build,preprocessor,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可以在各种环境中使用,例如A和B,A=Oracle,B=MySQL。为了传达在哪种
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注释:
No@Support注释意味着相应的方法不依赖于环境
空@Support注释意味着在所有环境中都支持相应的方法
参数化@Support注释意味着仅在作为注释参数提供的环境中支持相应的方法。
为了改进与API客户机的通信,我想编写一个Maven插件,用于API预处理。该插件将使用环境列表作为参数,以弃用所有提供的环境中不支持的所有方法
一些例子:
我使用环境_A运行插件:对界面没有影响。环境_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运行插件:
换句话说,在编译src/main/java中的源代码之前,该插件应该根据上述规则转换src/main/java中的所有源代码。原始来源应保持不变,以便随时复制。这可能吗?似乎是一个答案,但事实并非如此,因为它忽略了很多细节:
Maven可以在构建期间调用外部工具,但您仍然需要一个工具来处理源代码。
您打算如何让Maven Java编译器远离src/*/Java中的文件?如果不正确,它将尝试编译原始源代码和转换后的源代码。
您计划如何编辑原始来源?如果您将原始源文件移动到另一个文件夹,像m2e这样的工具将阻止您在Eclipse中编辑它们,因为它们读取您的POM来确定路径。
查看代码的开发人员将非常困惑,因为他们习惯于Maven,Maven说:src/*/java中的源代码将被编译并最终保存在工件中。所以你违反了惯例。
可能重复的。。。好吧,我为什么不用谷歌搜索一下呢?
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();
}