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

kop*_*per 5 maven-2

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

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

在现实世界中,"环境"随着时间的推移而变化,或者在开发者机器之间变化,可能是因为它包含一些既不期望也不意识到的依赖性.

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

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

  1. 比较通过获得的有效POM mvn help:effective-pom
  2. 比较mvn可执行版本+其他涉及的工具(例如jdk)
  3. 比较环境设置(使用命令行set命令在Windows下获得)
  4. 比较settings.xml用户主目录中的文件
  5. 比较使用生成的类路径 mvn dependency:build-classpath
  6. 删除存储库甚至两个存储库

还有什么想法可以提供有价值的信息吗?也许有一种更好的方式我只是想念......

Arm*_*and 0

我见过很多 Maven 构建在不同的机器上出现问题,因为不同版本的 Maven 或 Java 以及相关的错误或功能。我什至看到构建失败并在同一台机器上通过,例如在命令行上构建与在 IDE 中构建时。

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

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