Maven 2 “故障排除算法”;Maven没有';“不为我工作”;问题

Maven 2 “故障排除算法”;Maven没有';“不为我工作”;问题,maven-2,Maven 2,我在Maven中遇到的最常见和最烦人的问题之一是构建过程失败/通过,具体取决于谁、何时以及在哪台机器上执行该过程 更正式地说-在理想世界中我希望构建过程是可重复的。作为一名程序员,我会说,我希望构建过程就像一个源代码和资源的构建输入和“环境”——我希望它在任何时间和任何地方都能返回相同的结果,我使用“固定环境”对它进行“评估”,我希望(更希望)团队中的每个人都有相同的“固定环境” 在现实世界中要么“环境”随着时间的推移而变化,要么在开发人员机器之间变化,可能是因为它包含一些既不期望也不实现的依赖

我在Maven中遇到的最常见和最烦人的问题之一是构建过程失败/通过,具体取决于谁、何时以及在哪台机器上执行该过程

更正式地说-在理想世界中我希望构建过程是可重复的。作为一名程序员,我会说,我希望构建过程就像一个源代码和资源的构建输入和“环境”——我希望它在任何时间和任何地方都能返回相同的结果,我使用“固定环境”对它进行“评估”,我希望(更希望)团队中的每个人都有相同的“固定环境”

在现实世界中要么“环境”随着时间的推移而变化,要么在开发人员机器之间变化,可能是因为它包含一些既不期望也不实现的依赖关系

我想问这个问题的目的是找到/定义一个算法/过程或检查表,用于对不可重复的Maven构建过程进行故障排除。假设我们有两台具有相同操作系统的独立机器A和B,并且我们在它们上构建完全相同版本的应用程序,但它们给出了不同的结果(例如一个成功,一个失败)。应在何处/如何查找这两个“环境”之间的差异

以下是我通常使用的一些步骤:

  • 比较通过mvn帮助:有效pom获得的有效pom
  • 比较mvn可执行版本+其他相关工具(例如jdk)
  • 比较环境设置(在Windows下使用命令行的
    set
    命令获得)
  • 比较用户主目录中的
    settings.xml
    文件
  • 比较使用mvn依赖项生成的类路径:构建类路径
  • 删除存储库,甚至删除两个存储库

  • 还有什么想法可以提供有价值的信息?也许有一个更好的方法我只是错过了…

    我已经看到很多Maven构建在不同的机器上出错,因为Maven或Java的不同版本以及相关的bug或特性。我甚至见过在同一台机器上构建失败并通过的情况,例如,在命令行上构建与在IDE中构建

    如果调用命令行工具,您可能会发现这些工具依赖于平台或机器。我在包任务中看到了这一点,包任务在Mac上创建.dmg文件,在Windows机器上创建.msi文件,包必须在这些操作系统上运行,才能创建特定的文件


    过去,资源和源文件的文件编码都给我带来了问题。检查project.build.sourceEncoding属性是否已设置似乎是有用的信息。与直觉相反,这似乎是在复制或筛选资源时使用的,但在处理源文件IIRC时被忽略。

    跟踪您的工作,并能够跟踪开发人员的工作:

  • 创建一个构建机器(用于发布构建),记录安装的每一个软件,以及选择的每一个配置选项
  • 必须以相同的方式设置私有构建机器,以确保构建工作的最大可能性
  • 当私有构建失败时,列出软件和配置,并将其与发布配置进行区分。假设差异不受支持,必须进行纠正,以达到成功构建的最大可能性
  • 让我们做美国式的烤面包:你烧,我刮--W.爱德华兹·戴明

    与其寻找解决不可重复构建问题的算法,修复根本原因,不如通过以下良好实践使其可重复(如果使用得当,Maven构建是100%可重复的):

    • 在给定项目的所有计算机上使用相同版本的Maven(分发打包版本)
    • 使用相同版本的JDK(至少对给定项目使用相同版本)
    • 锁定POM中的插件版本以实现构建的可复制性
    • 使用
    • 使用公司存储库(并且仅使用公司存储库)
    • 通过在
      ~/.m2/settings.xml
    • 将所有内容置于版本控制之下(所有机器上的有效pom应相同)
    • 在生成计算机上运行干净的生成(参考)
    我在有数百名开发人员的组织中使用过Maven,但没有遇到您描述的问题。事实上,我很抱歉地说,您面临的问题不是Maven的错,它们只是糟糕的开发实践的结果(我不是故意粗鲁,但这是真的)

    这本身并不是一个真正的答案,但我们每周都会删除构建机器上的整个本地回购

    构建机器还被限制为开发人员无法编辑的一小部分本地和代理repo

    起初,我们有很多构建在回购协议被删除后停止工作。现在它是一个每月的问题。它的趋势是每隔一个月出现一次问题


    这促进了在锁定版本号、插件版本、为本地构建使用配置文件、在需要时使用排除以及将第三方JAR添加到正确位置方面的许多良好实践

    实际上,我要问的是如何区分这些软件和配置。你知道怎么做吗?对不起,我以为你在寻找过程,而不是如何区分。这取决于你如何跟踪信息。您可以在文本文件中跟踪它们并运行“diff”。。。您可以在数据库中跟踪它们,并将每个更改作为不同的数据库条目。。。您可以将一个文件置于源代码管理下,并使用源代码管理的diff机制。。。你可以使用tripwire…也许问题的标题应该是“Maven不适合我”,或者你真的认为Maven适合人是个问题吗?:)哎呀,我把t字打错了