2011-01-11 18 views
30

Me pregunto cuál es la principal diferencia entre ejecutar "mvn compile" y "mvn clean compile", en la práctica.En Maven, ¿Por qué ejecutar 'mvn clean'?

Entiendo cuál es la diferencia real, que "mvn clean compile" borra todos los archivos generados y comienza de nuevo desde el principio, pero ¿por qué querríamos hacer esto? Puedo asumir que "mvn compile" regenerará los archivos si es necesario, ¿no?

Una cosa que noté en mi proyecto fue que si había eliminado un archivo fuente, sin ejecutarlo, el archivo compilado se mantiene, lo que normalmente no sería un problema, pero podría ser, supongo.

+0

Interesante pregunta. Creo que al usar "make" para aplicaciones c/C++ no es frecuente que se requiera una limpieza ya que maneja las dependencias entre los archivos fuente. Supongo que maneja el caso de eliminación/cambio de nombre también. –

Respuesta

15

Ciertos complementos requieren un clean para funcionar correctamente. Por ejemplo (al menos en Maven 2), el maven-war-plugin explota cada WAR dependiente en un árbol de directorios existente. Requiere un clean para deshacerse de los archivos que se han eliminado de los WAR dependientes.

Otro problema es que cuando cambia el nombre de una clase, la versión compilada anterior puede permanecer en el árbol de compilación, y se incluirá en archivos JAR, etcétera ... hasta que ejecute mvn clean.

Supongo que "mvn compile" regenerará los archivos si es necesario, ¿no?

Para los complementos convencionales, eso es una suposición razonable. Sin embargo, si está utilizando un complemento para generar componentes de código fuente, examinaría cuidadosamente la documentación y dónde coloca el código fuente generado. Por ejemplo, hay un par de complementos no compatibles cuyo propósito es conducir el generador de códigos Eclipse EMF.

+1

A menudo me atrapa el código que "funciona" con "mvn compile test" pero que realmente no funciona con "mvn clean compile test". – schmmd

24

Por ejemplo: si cambia el nombre de una clase, la versión compilada anterior permanecerá en target/classes hasta que ejecute clean. Esto puede ser completamente inofensivo, pero podría causar problemas si es detectado automáticamente por el escaneado de classpath y similares.

+0

Sí, este fue el problema con el que me encontré con la detección de prueba en nuestro servidor de compilación. –

+0

definición en un servidor de compilación, simplemente ejecute una prueba limpia cada vez ... no debe ser mucho más lento y evitará cualquier rasguño innecesario en la cabeza (muchos rasguños necesarios con maven en el mejor de los casos) –

+0

Entonces, ¿por qué don? ¿Acaso solo arreglan Maven para lidiar adecuadamente con las dependencias de compilación, o al menos hacen que "limpio" sea el predeterminado? – joeking

1

en Maven, cada vez que quiera compilar, es una buena práctica para ejecutar "mvn clean". borra las clases existentes que compiló en la última compilación. si no desea ejecutar 3 líneas, simplemente haga "prueba mvn" después de "mvn clean". no tienes que hacer siempre "mvn compilar".

0

Si no hace una compilación limpia, significa que todavía puede trabajar con algunas clases obsoletas. Si su módulo supone migrar a una nueva clase, incluso si se lo perdió, no existirá ningún error de compilación debido a la existencia de una clase anterior en el destino/las clases. Esto permanecerá desapercibido hasta que el mismo módulo se construya en otro lugar/máquina con un objetivo de compilación limpio.

Cuestiones relacionadas