迁移到Maven

3
我继承了一个基于Java的、基于Web的、有大约750K行代码的7年老产品。由于它的年龄,它不是基于Maven的结构。Maven用于构建和发布应用程序。然而,Maven被用于该项目时存在问题,通常会调用Ant脚本。
我想将其迁移到Maven,因为在当前设置中,任何新工具(如Sonar、Hudson等)的接入都很麻烦。
我正在征询意见,询问应该采取什么样的策略来进行这种更改?假设我可以腾出时间和资金来移动代码并将其转换为Maven,那么测试没有因为Maven化而导致任何功能损坏的有效方法是什么?需要注意的是,我们不能依赖单元/集成测试,因为代码覆盖率低于10%。
如果我比较现有设置创建的war文件和Maven化后创建的war文件之间的差异,这两个war文件应该是相同的(大小和内容)吗?如果是,这是否足以保证没有功能损坏?
谢谢。

1
没有足够的代码覆盖率,一切都是未知数。 - Sahil Muthoo
2
不要先转向Maven,而是先进行良好的测试自动化。这是值得花钱的好投资。 - vivekv
我完全同意。但这些是IT行业的事实,每个专业人士都必须面对。我相信你们所有人都曾经参与过缺乏足够代码覆盖率的项目。 - partha
我同意 @vivekv。 我提到代码大约有750K,目的是让人们了解在单元测试方面花费时间和金钱(尽管从技术的角度来看是非常好的建议)是不足以取得管理层认可的。我们无法在管理层允许的时间内对那么多的代码进行单元测试。 - partha
如果你要把这样一个庞大的项目迁移到Maven上,准备好了吗?最大的麻烦是将其分割成多个模块。即使有很多测试,你仍然会遇到许多项目结构和打包问题,并且离能够运行测试还有很长的路要走。 - Kalpak Gadre
@partha 我不明白。管理层不会为高质量的软件付款,但他们会为新的构建工具付款,因为...? - vivekv
2个回答

1

首先,我可能会推荐使用Gradle,它似乎比Maven更酷。除此之外,我认为你计划运行旧版本和新版本的构建并比较它们的结果是一个好主意。

话虽如此,为了能够继续前进,您需要运行某种集成测试,即使用Selenium或JWeb Unit进行自动点击测试。

因此,我可能会从在Jenkins/Hudson/Bamboo上运行旧版本开始,然后开始编写点击测试,然后开始处理构建。

我还建议阅读与遗留代码有效地工作,因为它将为您提供许多重构代码的好工具。

关于测试不同版本是否构建相同的内容,我现在执行以下操作:

/opt/gradle/bin/gradle clean war && jar -tf build/libs/new.war  | sort > /tmp/gradle-war.txt && diff /tmp/ant-war.txt /tmp/gradle-war.txt

/tmp/ant-war.txt 是由以下程序生成的

jar -tf old.war | sort | uniq > /tmp/ant-war.txt

这样我就可以得到两个构建中发生了什么变化的良好输出。


谢谢。你用过Gradle吗?我觉得(如果我错了请纠正)大部分工具,比如代码覆盖率工具、Sonar、Jenkins等都已经与Maven集成好了,而Gradle的支持还不是很完善。虽然我不想落后于技术,但也不想太过激进。不过,这是个好建议。我会更详细地了解一下。还有,谢谢你推荐的书。 - partha
1
尚未在生产中使用Gradle,但我一直在试用它。您关于Maven集成良好的观点是一个好观点,我必须承认。我想使用Gradle的原因是它在项目布局上比Maven松散,并且我喜欢用编程语言而不是XML进行编程。 - slipset

1

如果您在切换时使用Maven的标准文件夹结构,则两个项目可能不会完全相同。您可以更改超级POM以更改文件夹以匹配您拥有的内容,但这样做会削弱使用Maven的优势之一。我建议坚持使用标准结构。

因此,测试外部代码库以验证功能而不考虑内部结构是可取的。Selenium非常适合此类测试。


1
当然。看到人们如此热衷于谈论代码覆盖率、测试的重要性等等,但是在整个行业中,仍有大量生产代码在基本代码规范方面表现极差,这真是太有趣了。几乎感觉IT专业人员(技术人员)需要有一个更具有说服力的团结立场,推动管理层做必要的事情,而不是只花钱添加新功能。 - partha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接