将复杂项目从 Ant 迁移到 Maven - 如何处理异常的文件夹结构?

2022-09-01 05:51:20

在我的新项目中,我面临着一个复杂的基础设施,其中包含几个模块,这些模块多年来以一种令人不快,不受控制的方式增长。

直截了当地说:构建过程是可怕的。有 40 多个不同、复杂的 Ant 文件,这些文件连接了多次,SOA 框架还生成了几个动态 Ant 文件。花了几天时间才真正了解所有依赖项,并最终构建了整个项目,没有任何错误。

我的计划是或正在将整个项目从Ant迁移到Maven,因为计划了新的组件,我想在未来避免这些问题,因为它现在的方式太可怕了;-)

由于我是大型项目迁移的新手,因此我对最佳工作流程有点困惑。涉及数十个XML文件和脚本,它们分布在非Maven目录结构中。总共涉及3000多个文件。其中一个主要问题是,我不知道我是否真的应该尝试迁移已知Maven目录结构中的所有内容,因此冒着无休止的编辑和重构每个文件的风险。或者我应该保持文件夹结构不变,并膨胀我的pom.xml文件,并可能遇到所有不同涉及的插件的问题?老实说,这两种方式听起来都不是很有建设性。

将此维度中的项目迁移到 Maven 是否有意义?特别是当SOA框架必须使用自己的Ant文件时 - 因此Ant和Maven的组合是必要的。简化此过程的最佳策略是什么?

感谢所有的建议。


答案 1

以下是对 Mavenizing a Ant 项目的简单而快速的答案:

别这样!

这不是一些反Maven的熨平板。我使用Maven,我喜欢Maven。它迫使开发人员不要做愚蠢的事情。开发人员在编写构建脚本方面很糟糕。他们想以这种方式做事,而不是其他人那样做事。Maven让开发人员以每个人都能理解的方式设置他们的项目。

问题在于,Ant允许开发人员做疯狂而疯狂的事情,你必须在Maven中完全重做。它不仅仅是目录结构。Ant 允许多个构建工件。Maven 只允许每 1 个。如果您的 Ant 项目生成了六个不同的 jar 文件,并且这些 jar 文件包含许多相同的类,该怎么办?您必须仅为jar创建六个Maven项目,然后为jar之间共有的文件创建另外六个。pom.xml

我知道,因为我正是这样做的。系统架构的负责人认为Maven是新的和好的,而Ant必须是坏的和邪恶的。构建是否有效且结构良好并不重要。不,蚂蚁必须走,而Maven是路。

开发人员不想这样做,所以它落在了我身上,CM。我花了六个月的时间把所有东西都重写成Maven。我们有WSLD,我们有Hibernate,我们有各种框架,不知何故,我不得不重组所有内容才能使其在Maven中工作。我不得不催生新的项目。我不得不四处移动目录。我必须找出新的做事方式,同时又不妨碍开发人员进行大量的开发。

这是地狱最核心的圈子。

Ant 项目如此复杂的原因之一可能与依赖关系管理有关。如果你像我们现在的商店一样,一些开发者决定一起开发自己的依赖管理系统。在看到这个依赖管理系统之后,我现在知道开发人员永远不应该写两件事:他们自己的构建文件和依赖管理系统。

幸运的是,蚂蚁已经存在一个名为Ivy的依赖管理系统。Ivy的好处在于它与当前的Maven架构一起工作。您可以使用站点的集中式 Maven 存储库,Ivy 可以将 jar 作为 Maven 工件部署到该存储库。

我创建了一个常春藤项目,它自动为开发人员设置所有内容。它包含必要的设置和配置,以及一些可以取代一些标准 Ant 任务的宏。我曾经把这个常春藤项目附加到主项目上。svn:externals

将项目添加到当前的构建系统中并不难:

  • 我不得不在 中添加几行,以将我们的项目集成到当前项目中。build.xmlivy.dir
  • 我必须为该项目定义一个文件。ivy.xml
  • 我将 和 的任何实例更改为 和 。这个宏完成了标准任务所做的一切,但它也像Maven builds一样将嵌入到jar中(Ivy有一个将文件转换为)的任务。<jar</jar><jar.macro</jar.macro><jar/>pom.xmlivy.xmlpom.xml
  • 我撕掉了其他开发人员添加的所有旧的依赖管理废话。这可能会将文件减少一百行。我还撕掉了所有做结账和提交的东西,或者ftp'd或scp'd的东西。所有这些东西都是为他们的Jenkins构建系统准备的,但是Jenkins可以在没有任何构建文件帮助的情况下处理这个问题,谢谢。build.xml
  • 添加几行以集成常春藤。最简单的方法是删除目录中的 jar,然后通过 下载它们。总而言之,可能需要添加或更改十几行代码才能执行此操作。libivy.xmlbuild.xml

我到了这样一个地步,我可以在几个小时内将Ivy集成到一个项目中 - 如果构建过程本身不是太混乱的话。如果我必须从头开始重写构建.xml,我可能需要两到三天的时间。

使用Ivy清理了我们的蚂蚁构建过程,并允许我们在Maven中拥有许多优势,而无需进行彻底的重组。

顺便说一句,此过程最有用的工具是超越比较。这使我能够快速验证新的构建过程是否与旧的构建过程兼容。


无论如何,搬到Maven...

有趣的是,一旦你将Ant项目与Ivy集成在一起,将它们变成Maven项目就不那么困难了:

  • 清理 .您可能必须从头开始重写它,但是如果没有大多数依赖项管理垃圾,它就不那么困难了。build.xml
  • 清理后,开始移动目录,直到它们与Maven的结构匹配。build.xml
  • 更改源以匹配新的目录结构。您可能有一个 WAR,其中包含位于非标准位置的 *css 文件,并且代码是硬连线的,以便将这些文件放在该目录中。您可能需要更改 Java 代码以匹配新的目录结构。
  • 将构建多个项目的 Ant 项目分解为单独的 Ant 项目,每个项目构建一个工件。
  • 添加 和 删除 .pom.xmlbuild.xml

1 是的,我知道这并不完全正确。有带有子项目和超级poms的Maven项目。但是,你永远不会有一个Maven项目来构建四个不同的不相关的jar,而这在Ant中很常见。


答案 2

我过去做过类似的迁移,我也有同样的怀疑。但是,我选择了“保持文件夹结构不变并在POM文件中指定路径”的方式,我注意到它并不像我想象的那么糟糕。

我实际上必须做的是适当地设置和,并可能添加一些包含和排除过滤器,但最终我会说,即使Maven的方式确实是约定俗成的而不是配置的,如果你遵循它关于放置文件的指令,它也不会让你的生活更轻松,如果你不这样做,它也不会让它变得更难<sourceDirectory><outputDirectory>

此外,在迁移时真正帮助我的是可以将Maven项目划分为模块,我最初用它来复制Ant结构(即我为每个构建.xml文件都有一个Maven模块),使迁移的第一阶段更简单,然后我更改了模块聚合,使其更有意义,更像Maven。

不确定这是否真的对你有任何意义,因为我没有任何生成的Ant文件,我侦察可能是你最大的问题,但我肯定会再次遵循这条路,而不是重构和移动文件到处来Mavenize我的项目结构。


推荐