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

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

直言不讳:构建过程令人恐惧。有40多个不同的复杂Ant文件,它们被多次连接,并且SOA框架还生成了多个动态Ant文件。花了几天的时间才能真正理解所有依赖关系,并最终构建整个项目而没有任何错误。

我的计划是将整个项目从Ant迁移到Maven,因为已经计划了新的组件,并且我希望将来也能避免这些问题,因为这只是现在的方式;-)

由于我不熟悉大型项目的迁移,因此我对最佳工作流程有些困惑。涉及许多XML文件和脚本,它们以非Maven目录结构分布。总体而言,涉及3000多个文件。主要问题之一是,我不知道我是否真的应该尝试迁移已知Maven目录结构中的所有内容,因此冒着无休止地编辑和重构每个文件的风险。还是应该保持文件夹结构不变,并膨胀我的pom.xml文件,并且可能会遇到所有涉及到的不同插件的问题?老实说,这两种方法听起来都不具有建设性。

在这个维度上将项目迁移到Maven甚至有意义吗?尤其是当SOA框架必须使用其自己的Ant文件时-因此,必须结合使用Ant和Maven。简化此过程的最佳策略是什么?

感谢所有建议。

参考方案

这是Mavenizing Ant项目的简单快速的答案:

不要这样做!

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

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

我知道,因为我正是这样做的。系统架构负责人认为,Maven是新的和好的,而Ant必须是坏的和邪恶的。构建工作正常且结构合理无所谓。不,蚂蚁必须走,而Maven就是这样。

开发人员不想这样做,所以由我负责,即CM。我花了六个月的时间将所有内容重写为Maven。我们有WSLD,我们有Hibernate,我们有各种框架,以某种方式,我必须重组所有内容才能使其在Maven中工作。我不得不产生新的项目。我不得不四处移动目录。我必须找出新的工作方式,而所有这些都不能阻止开发人员进行大量开发。

这是 hell 最内心的一圈。

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

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

我创建了一个常春藤项目,该项目会自动为开发人员设置所有内容。它包含必要的设置和配置,以及一些可以替换一些标准Ant任务的宏。我使用svn:externals将这个Ivy项目附加到主项目。

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

  • 我必须在build.xml中添加几行,以将我们的ivy.dir项目集成到当前项目中。
  • 我必须为该项目定义一个ivy.xml文件。
  • 我将<jar</jar>的任何实例更改为<jar.macro</jar.macro>。这个宏完成了标准<jar/>任务所做的所有工作,但它也像Maven构建一样将pom.xml嵌入到jar中。 (Ivy的任务是将ivy.xml文件转换为pom.xml)。
  • 我删除了其他开发人员添加的所有旧的依赖项管理废话。这样可以将build.xml文件减少一百行。我还删除了所有用于结帐和提交的内容,或者ftp或scp的内容。所有这些东西都是针对他们的Jenkins构建系统,但是Jenkins可以在没有构建文件任何帮助的情况下进行处理,谢谢。
  • 添加几行以集成Ivy。最简单的方法是删除lib目录中的jar,然后通过ivy.xml下载它们。总共可能需要在build.xml中添加或更改十几行代码才能执行此操作。
  • 我想到了可以在几个小时内将Ivy集成到项目中的地步-如果构建过程本身不是很混乱。如果必须从头开始重写build.xml,则可能要花两三天的时间。

    使用Ivy清理了我们的Ant构建过程,并为我们提供了在Maven中拥有的许多优势,而无需进行完整的重组。

    顺便说一句,此过程最有用的工具是Beyond Compare。这使我可以快速验证新的构建过程是否与旧的兼容。

    无论如何要进入Maven ...

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

  • 清理build.xml中的逻辑。您可能需要从头开始重写它,但是没有大多数依赖管理垃圾,这并不那么困难。
  • 清理完build.xml后,开始移动目录,直到它们与Maven的结构匹配为止。
  • 更改源以匹配新的目录结构。您可能有一个WAR,它在非标准位置包含* css文件,并且代码很难在这些目录中包含这些文件。您可能必须更改Java代码以匹配新的目录结构。
  • 将构建多个项目的Ant项目分解为单独的Ant项目,每个项目都构建一个工件。
  • 添加一个pom.xml并删除build.xml
  • 1是的,我知道这并非完全正确。有带有子项目和超级pom的Maven项目。但是,您将永远不会有一个Maven项目可以构建四个不相关的jar,而这在Ant中很常见。

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    JAVA:字节码和二进制有什么区别? - java

    java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

    java:继承 - java

    有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

    Java:BigInteger,如何通过OutputStream编写它 - java

    我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

    Java DefaultSslContextFactory密钥库动态更新 - java

    我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…