我正在为多个hadoop集群编写java代码,其中一个是hdp2.2,另一个是cdh4。我编写的代码需要在这两个平台上都可以运行。这导致需要不同版本的多个hadoop依赖项,这些依赖项是不向后兼容的。例如,hdp版本需要使用protobuf for hbase来定制过滤器,因为它比0.96更新,而cdh4使用hbase 0.94。我已经将我的代码的所有hadoop依赖性减少到一个api中的几个包,并使用maven概要文件来处理依赖于此的代码,但是如果可能的话,我希望利用dry原则,这样我编写的针对该api的代码就不必每次进行更改时都从hdp中挑选或复制到cdh4。
我目前在多个git分支中都有这段代码,但这很难维护。
我意识到java的目的是只写一次,在任何地方都可以运行,但这是其中一种似乎不容易实现的情况。我可以想到一些可能的选择,其中一些可能只重构不能重复到单独位置的代码:
使用maven子模块并根据我正在使用maven概要文件构建的hadoop版本选择一个子模块。
将来自多个git分支的代码重构到同一项目中的单独java包中,并使用maven profiles和maven compiler exclude选项来选择基于hadoop版本的包。
可能有更好的解决方案,我不知道。
1条答案
按热度按时间oo7oh9g91#
我会把这个项目组织成至少3个子模块,例如。
项目
常见的
v2凝灰岩
V4之类的
根据您交付项目的方式,您可能会有更多的子模块来为每个版本的hadoop组装最终的工件。