2011-06-09 16 views
6

Tengo una jarra de terceros que es necesaria para nuestro proyecto. No está disponible en el repositorio de maven central, así que usé maven-install-plugin para instalar el jar localmente durante una compilación. Ate el objetivo de "instalar archivo" a la fase de "validar", y esto funciona principalmente. El extracto de archivo pom.xml es el siguiente:mvn limpio sin dependencias

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
... 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <version>2.3</version> 
      <executions> 
       <execution> 
        <id>install-myartifact</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>install-file</goal> 
        </goals> 
        <configuration> 
         <file>${basedir}/lib/myartifact-1.2.3.jar</file> 
         <groupId>com.example</groupId> 
         <artifactId>myartifact</artifactId> 
         <version>1.2.3</version> 
         <packaging>jar</packaging> 
         <generatePom>true</generatePom> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>myartifact</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
</dependencies> 

Sin embargo, hay un inconveniente. La mayoría de nuestros desarrolladores y nuestra instalación de Jenkins ejecutan "mvn clean install". La fase de "validar" no es parte del ciclo de vida "limpio" y limpiar inexplicablemente requiere que todas las dependencias estén presentes para ejecutarse. Entonces, la primera vez que alguien ejecuta esta compilación, no funciona.

[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building MyModule 
[INFO] task-segment: [clean, install] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [clean:clean] 
[INFO] Deleting directory C:\svn\trunk\mymodule\target 
Downloading: http://nexusserver.local:8080/nexus/content/groups/public/com/example/myartifact-1.2.3.pom 
[INFO] Unable to find resource 'com.example:myartifact:pom:1.2.3' in repository central (http://central) 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Failed to resolve artifact. 

Missing: 
---------- 
1) com.example:myartifact:jar:1.2.3 

    Try downloading the file manually from the project website. 

    Then, install it using the command: 
     mvn install:install-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file 

    Alternatively, if you host your own repository you can deploy the file there: 
     mvn deploy:deploy-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id] 

    Path to dependency: 
    1) com.example:mymodule:war:0.0.1-SNAPSHOT 
    2) com.example:myartifact:jar:1.2.3 

---------- 
1 required artifact is missing. 

for artifact: 
    com.example:mymodule:war:0.0.1-SNAPSHOT 

from the specified remote repositories: 
    nexus (http://nexusserver.local:8080/nexus/content/groups/public) 



[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1 second 
[INFO] Finished at: Thu Jun 09 11:01:24 EDT 2011 
[INFO] Final Memory: 17M/247M 
[INFO] ------------------------------------------------------------------------ 

Si tuviera que funcionar simplemente "mvn instalar", el frasco se instala durante la "validación", y que se puede ejecutar "mvn instalación limpia" en generaciones posteriores. Sin embargo, nuestro servidor de compilación no tiene esa flexibilidad. He considerado lo siguiente:

  1. Mover la fase a "pre-clean", pero eso supone que todos siempre usan clean la primera vez. No ayudaría si alguien ejecutara simplemente "mvn install".
  2. Copiando la ejecución, ocurriendo una durante la "limpieza previa" y una ocurriendo durante la "validación". Esto cubre todas las bases, pero el código copiado deja un mal sabor.

Idealmente, me gustaría alguna otra opción. ¿Es posible correr limpio sin dependencias? ¿O ejecutar un complemento dos veces sin tener que copiar por completo la ejecución? ¡Gracias!

Respuesta

5

Parece que estás usando nexus. Puede ser más fácil implementar el artefacto en el repositorio del nexo en lugar de tener que mantenerlo con este proyecto.

+1

Es una buena idea, pero estamos en una corporación internacional con equipos de desarrollo fragmentados. Obtenerlo en el nexo maestro es un proceso largo. = ( –

+0

¿Qué le parece usar un repositorio de archivos local? Puede empaquetar el archivo en un directorio par/secundario con su módulo y luego agregar ese directorio como un archivo: repo dentro de su pom.xml. Puede configurar su configuración.xml para usar su repositorio de nexus como el espejo, pero aún así permite repositorios locales de archivos. – massfords

+0

Massfords: Cambiar settings.xml no es un comienzo, eso afectaría a todos los que usan la compilación. Sería mejor obtener el artefacto en el nexo maestro. . Voy a aceptar esa como la respuesta, porque a pesar de que no resuelve mi situación particular, debería ser para la mayoría de la gente. –

0

Esto no se ha probado, pero ¿no puede ignorar el error de la configuración del complemento limpio? Como en:

<plugin> 
    <artifactId>maven-clean-plugin</artifactId> 
    <version>2.4.1</version> 
    <configuration> 
    <failOnError>false</failOnError> 
    </configuration> 
</plugin> 

(Esto es de Maven Clean Plugin : Ignoring Clean Errors)

+1

Lamentablemente, no, el failOnError no omite no poder resolver las dependencias. –

0

Aquí es una de las posibilidades más.

Configure maven para omitir la fase de limpieza y ejecutar clean durante la inicialización. No he intentado esto sin embargo.

El inconveniente de esto es que maven siempre limpiará las carpetas de salida.

5

me encontré con un problema relacionado, y me encontré con esta pregunta cuando google para una solución, por lo que habrá dado cuenta de que aquí:

mvn limpia falla en un proyecto de varios módulos cuando hay dependencias que faltan durante el mismo proyecto, si se invocan complementos durante la limpieza.

Invocamos el antrun-plugin durante la fase de limpieza en algunos módulos, y debido a eso todas las dependencias deben estar presentes en el repositorio maven, incluidos los otros módulos en el mismo reactor, que en algunos casos no han sido construido aún (digamos que acabas de superar la versión del proyecto, o estás comenzando un nuevo proyecto).

Este es un error maven-antrun reportado en http://jira.codehaus.org/browse/MANTRUN-78 - que nuevamente nos lleva a un error en el núcleo de maven: http://jira.codehaus.org/browse/MNG-3283.

Mi solución consistía en proporcionar a los desarrolladores (y Jenkins) una forma alternativa de limpiar (script shell/bat, script ant) ​​o hacer una operación limpia de git/hg) y hacer que invoquen esto en su lugar.

Sugeriría una solución similar para su equipo (o simplemente instale un repositorio maven compartido internamente en su equipo, use una de las máquinas del desarrollador si es necesario).

Cuestiones relacionadas