2012-01-12 24 views
8

Tengo algunos proyectos con MUCHAS dependencias de maven. Cuando invoco el comando mvn deploy (o alguna variación del mismo), me gustaría no solo tener el proyecto implementado en el repositorio remoto, sino también todas sus dependencias. es posible? Veo muchas "preguntas similares" en este sitio, pero parece que no puedo encontrar nada tan simple como este. Todo lo demás que he visto parece esperar alguna funcionalidad adicional. Simplemente quiero implementar mi proyecto, más todas sus dependencias al repositorio remoto. Estoy usando el plugin de compilación de Maven 1.5Maven: implementar dependencias en el repositorio remoto

Este es un fragmento de mi settings.xml. ¿Alguna idea de lo que me estoy perdiendo?

<mirrors> 
<mirror> 
    <!--This is used to direct the public snapshots repo in the 
     profile below over to a different nexus group --> 
    <id>nexus-public-snapshots</id> 
    <mirrorOf>public-snapshots</mirrorOf> 
    <url>http://{ourServer}/nexus/content/groups/public-snapshots</url> 
</mirror> 
<mirror> 
    <!--This sends everything else to /public --> 
    <id>nexus</id> 
    <mirrorOf>*</mirrorOf> 
    <url>http://{ourServer}/nexus/content/groups/public</url> 
</mirror> 
    </mirrors> 
<profiles> 
<profile> 
    <id>development</id> 
    <repositories> 
    <repository> 
     <id>central</id> 
     <url>http://central</url> 
     <releases><enabled>true</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </repository> 
    </repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>central</id> 
     <url>http://central</url> 
     <releases><enabled>true</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </pluginRepository> 
    </pluginRepositories> 
</profile> 
<profile> 
    <!--this profile will allow snapshots to be searched when activated--> 
    <id>public-snapshots</id> 
    <repositories> 
    <repository> 
     <id>public-snapshots</id> 
     <url>http://public-snapshots</url> 
     <releases><enabled>false</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </repository> 
    </repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>public-snapshots</id> 
     <url>http://public-snapshots</url> 
     <releases><enabled>false</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </pluginRepository> 
    </pluginRepositories> 
</profile> 
</profiles> 

Gracias de antemano
~ j

+0

Creo que está recibiendo mal, usando Maven a construir en su entorno de desarrollo y despliegue el entregable (frasco, la guerra, el oído o paquete OSGi) al servidor. ¿Qué quieres decir exactamente con el repositorio remoto? ¿es un servidor? o un repositorio de código ??? –

+0

No. Me refiero a la implementación en mi repositorio maven remoto corporativo, usando 'mvn deploy' en la línea de comandos (o "Ejecutar como -> Maven Deploy" usando el plugin m2Eclipse Eclipse) – jacosta

+0

estamos usando sonatype nexus, si eso hace una diferencia, aunque creo que mvn install/mvn deploy son específicos de maven, no nexus – jacosta

Respuesta

2

Se podría empezar con un repositorio local limpio, intento de construir su aplicación y para cualquier error de dependencias, implementar dicha aplicación en el diccionario de la empresa. Esto garantizaría que todas las dependencias que necesita su aplicación residen en el repositorio corporativo antes de que su aplicación se construya e implemente.

Antes de esto, configuraría su repositorio local para reflejar central y otros repositorios conocidos, de modo que las bibliotecas de código abierto de terceros accedan automáticamente a su repositorio remoto en lugar de tener que cargarlo manualmente.

Puede ocurrir que no tenga demasiadas bibliotecas de terceros que necesite implementar manualmente.

+0

¿Puede explicar su punto sobre "configurar el repositorio local para duplicar repositorios centrales y otros conocidos"? No estoy seguro de lo que quieres decir con esto. Si mi repositorio local refleja central, ¿cómo terminarán las bibliotecas en el repositorio remoto? Me disculpo, no estoy muy bien versado en esto ... – jacosta

+0

@jacosta. Por lo general, un administrador de repositorio está configurado tanto para 'mirror'' central' como para otros repositorios necesarios, así como para permitir el despliegue de artefactos específicos del proyecto. Esto último se haría usando 'mvn deploy'. – Raghuram

+0

así que si hago un mirror central, y hago un 'mvn deploy', extraerá todo lo necesario del repositorio central a mi local, y también desplegará todo lo necesario para el repositorio remoto. – jacosta

3

Así es como funciona en pocas palabras, suponiendo que su repositorio remoto (Nexus, o Artifactory, o similar) y settings.xml están configurados correctamente.

Digamos que tiene un proyecto con una dependencia en commons-logging. Cuando Maven resuelva las dependencias de su proyecto como parte de una construcción, que hace estos pasos:

  1. cheques repo local para commons-logging.
  2. Si encuentra, hecho. Continuar con la compilación.
  3. Si no se encuentra: comprueba commons-logging en el repositorio remoto.
  4. Si lo encuentra, descargue el artefacto al repositorio local. Hecho; continuar con compilación.
  5. Si no se encuentra en el repositorio remoto: repo remoto contactos central para descargar commons-logging. Luego está disponible para que Maven lo descargue al repositorio local. Hecho; continuar con compilación.

Al final de estos pasos, commons-logging debe estar en sus repositorios locales y remotos sin nada más que hacer. Si no es así, entonces su settings.xml no está configurado para conectarse al repositorio remoto cuando busca dependencias (¿se está contactando directamente con Central?) O Nexus no está configurado correctamente.

---- ---- Editar

He aquí un fragmento de mi settings.xml que funciona. @ Raghuram te dio un buen consejo cuando sugirió que permitieras ambos perfiles; Si de alguna manera habilitó solo el perfil public-snapshots sus compilaciones continuarán afectando a maven central directamente.

.... 
<mirrors> 
    <!-- redirects all traffic to internal Nexus repo instead of Maven central --> 
    <mirror> 
     <id>maven2</id> 
     <mirrorOf>*</mirrorOf> 
     <url>http://repository.someCompany.com/maven2RepoOrGroupInNexus</url> 
    </mirror> 
</mirrors> 
.... 
<profiles> 
    <profile> 
     <id>repo-profile</id> 
     <repositories> 
      <repository> 
       <id>central</id> 
       <url>http://gotoNexus</url> <!-- URL is unimportant here --> 
       <snapshots> 
        <enabled>true</enabled> 
        <updatePolicy>daily</updatePolicy> 
       </snapshots> 
       <releases> 
        <enabled>true</enabled> 
        <updatePolicy>daily</updatePolicy> 
       </releases> 
      </repository> 
     </repositories> 
    </profile> 
</profiles> 
<activeProfiles> 
    <activeProfile>repo-profile</activeProfile> <!-- important --> 
</activeProfiles> 

Nota elemento activeProfiles en la parte inferior; así es como asegurarse de que usará Nexus en lugar de Maven central con cada comando mvn.

Aún debe asegurarse de que Nexus esté configurado para que la URL definida en el <mirror> incluya contenido de Maven central, pero la forma de configurar Nexus sería una pregunta aparte.

Referencia: Nexus docs for Maven configuration

+0

Pensé que tenía esto funcionando, pero igual parece que no puedo instalar desde mi repositorio remoto y central al mismo tiempo. Puedo hacer que se instale desde uno u otro. Agregué un fragmento de mi settings.xml a mi pregunta original, si no le importa echarle un vistazo. – jacosta

1

propongo la siguiente solución que parece mucho menos como ensayo y error para resolver las dependencias en comparación con las respuestas existentes.

Lo que puede hacer es llamar al mvn -Dmdep.copyPom=true dependency:copy-dependencies después de implementar el proyecto principal. Esto copiará transitivamente todas las dependencias de su proyecto a target/dependency incluyendo sus respectivos archivos pom.

Puede iterar a través de todas las dependencias y desplegarlas en el repositorio usando deploy:deploy-file, p. Ej. con un bucle tales bash:

for pom in target/dependency/*.pom; do mvn deploy:deploy-file -Durl=http://your/repo -Dfile="${pom%%.pom}.jar" -DgeneratePom=false -DpomFile="$pom" 
Cuestiones relacionadas