One of the most common and annoying problems I encounter with Maven is the building process failing/passing depending on who, when and on which machine is executing the process.
More formally - in ideal world I would expect the build process to be repeatable. As a programmer I would say that I expect the build process to be like a pure function of source code and resources being build input and "an environment" - I would expect it to return the same result any time and anywhere I "evaluate" it using "fixed environment" and I expect (rather wish) that everyone in the team has the same "fixed environment".
In real world either "an environment" changes over time or varies between developer machines, possibly because it includes some dependencies one neither expects nor realizes.
What I am trying to achieve asking this question is finding/defining an algorithm/procedure or check list for troubleshooting not repeatable Maven build processes. Let assume we have two separate machines A and B with the same OS and that we are building exactly the same version of our application on them, but they give different results (for example one is successful and one fails). Where/how one should look for differences between these two "environments".
These are some steps I usually use:
- compare effective POMs obtained via
mvn help:effective-pom
- compare mvn executable versions + other involved tools (for example jdk)
- compare environment settings (obtained under Windows using command line's
set
command) - compare
settings.xml
files from user's home directories - compare classpaths generated using
mvn dependency:build-classpath
- delete repository or even both repositories
Any ideas what else can give valuable informations? Maybe there is a better way I am simply missing...