javamaven

In Maven, Why Run 'mvn clean'?


I am wondering what the major difference between running mvn compile and mvn clean compile are, in practicality.

I understand what the actual difference is, that mvn clean compile deletes all the generated files and starts again from scratch, but why would we want to do this? I can assume mvn compile will regenerate files if it's necessary, right?

One thing I noticed in my project was that if you had deleted a source file, without running clean, the compiled file remains, which usually wouldn't be a problem, but could be I suppose.


Solution

  • As noted in Gareth's answer, when you rename or remove a source class, Maven doesn't have sufficient information to know to remove the corresponding compiled file from the previous build. The presence of the stale file can cause unexpected runtime problems. A clean is required to get rid of the stale files so that they doesn't get accidentally included in WARs, JARs and so on.

    In addition, certain plugins require a clean in order to work properly. For example (at least in Maven 2), the maven-war-plugin explodes each dependent WAR into an existing directory tree. A clean is required to get rid of stale files left over from previous versions of the dependent WARs.

    I can assume "mvn compile" will regenerate files if it's necessary, right?

    For mainstream plugins, that is a fair assumption. However, if you are using a plugin to generate source code components, I'd look carefully at the documentation, and at where you put the generated source code. For instance, there are a couple of unsupported plugins whose purpose is to drive the Eclipse EMF code generator.