解决“Maven对我不起作用”问题的故障排除算法

时间:2010-04-22 11:32:31

标签: maven-2

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

更正式 - 在理想世界我希望构建过程可重复。作为程序员,我会说我希望构建过程就像pure function源代码和资源构建输入和“环境” - 我希望它能随时随地返回相同的结果“评估“它使用”固定环境“,我希望(而非希望)团队中的每个人都拥有相同的”固定环境“。

在现实世界中“一个环境”随着时间的推移会发生变化,或者在开发者计算机之间发生变化,可能是因为它包含了一些既不期望也没有实现的依赖关系。

我想要实现的问题是找到/定义一个算法/程序或检查列表,以便排除故障,而不是可重复的Maven构建过程。假设我们有两台独立的机器A和B相同的操作系统,我们正在构建完全相同的应用程序版本,但它们会产生不同的结果(例如,一个成功,一个失败)。在哪里/如何应该寻找这两个“环境”之间的差异。

这些是我经常使用的一些步骤:

  1. 比较通过mvn help:effective-pom
  2. 获得的有效POM
  3. 比较mvn可执行版本+其他涉及的工具(例如jdk)
  4. 比较环境设置(使用命令行的set命令在Windows下获得)
  5. 比较用户主目录中的settings.xml个文件
  6. 比较使用mvn dependency:build-classpath
  7. 生成的类路径
  8. 删除存储库甚至两个存储库
  9. 还有什么想法可以提供有价值的信息吗?也许有一种更好的方式我只是想念......

4 个答案:

答案 0 :(得分:4)

  

让我们为美式风格做点什么:你烧,我会刮。 --W。爱德华兹戴明。

不是寻找一个算法来解决你的不可重复的构建,修复根本原因,通过遵循良好的做法使它们可重复(如果你正确使用它,Maven构建是100%可重复的):< / p>

  • 在给定项目的所有计算机上使用相同版本的Maven(分发打包版本)
  • 使用相同版本的JDK(至少是给定项目的相同版本)
  • 锁定poms中的插件版本以提高构建重现性
  • 使用Maven Enforcer Plugin
  • 强制执行上述规则
  • 使用公司存储库(只有公司存储库)
  • 通过在~/.m2/settings.xml
  • 中添加非用户特定内容,避免使构建变得不可移植
  • 将所有内容置于版本控制之下(所有机器上的有效pom应该相同)
  • 在构建计算机上运行clean build(引用)

我在拥有数百名开发人员的组织中使用了Maven,而没有遇到您所描述的问题。实际上,我很遗憾地说,你面临的问题不是Maven的错,它们只是糟糕的开发实践的结果(我不是故意粗鲁但是这是真的)。

答案 1 :(得分:1)

不是本身的答案,但我们每周都会删除构建计算机上的整个本地存储库。

构建机器也仅限于开发人员无法编辑的一小组本地和代理回购。

起初我们有很多构建只在删除repo后停止工作。现在是一个月度问题。它趋向于每隔一个月的问题。

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

答案 2 :(得分:0)

由于Maven或Java的不同版本以及相关的错误或功能,我看到很多Maven构建在不同的机器上滑落。我甚至看到构建失败并在例如同一台机器上传递建立在命令行上而不是内置在IDE中。

如果调用命令行工具,您可能会发现这些工具依赖于平台或机器。我最常见的是在Windows上的Mac或.msi上创建.dmg文件的打包任务,并且必须在这些操作系统上运行打包以创建特定文件。

资源和源文件的文件编码在过去引起了我的问题。检查project.build.sourceEncoding属性是否设置似乎是有用的信息。反直觉地说,这似乎在复制或过滤资源时使用,但在处理源文件IIRC时被忽略。

答案 3 :(得分:0)

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

  1. 创建构建计算机(用于发布版本),记录安装的每个软件,以及选择的每个配置选项
  2. 必须以相同的方式设置私有构建计算机,以确保构建工作的最大可能性
  3. 如果私有版本失败,请列出软件&amp;配置并根据发布配置区分它们。假设差异不受支持,必须予以纠正才能达到成功构建的最大可能性