Issue
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.
Answered By - Stephen C
Answer Checked By - Katrina (JavaFixing Volunteer)