Mejores prácticas para copiar archivos con Maven

Tengo archivos de configuración y varios documentos que quiero copiar desde el entorno de desarrollo al directorio dev-server usando Maven2. Extrañamente, Maven no parece fuerte en esta tarea.

Algunas de las opciones:

  • Uso simple de una tarea de copia en Maven

  • Use el plugin Ant para ejecutar la copia de Ant.

  • Construye un artefacto de tipo zip , junto con el artefacto “principal” del POM que generalmente es de tipo jar , luego descomprime ese artefacto del repository en el directorio de destino.

  • maven-resource plugin, como se menciona a continuación.

  • El complemento Maven Assembly, pero parece necesitar muchas definiciones manuales, cuando quiero hacer las cosas de manera simple y “convencional”.

  • ¡Esta página incluso muestra cómo crear un complemento para hacer copias!

  • maven-upload plugin, como se menciona a continuación.

  • maven-dependency-plugin with copy , como se menciona a continuación.

Todo esto parece innecesariamente ad hoc: se supone que Maven debe excel al realizar estas tareas estándar sin problemas ni molestias.

¿Algún consejo?

No te intimides con el plugin Antrun. Solo porque algunas personas tienden a pensar que Ant y Maven están en oposición, no lo son. Utilice la tarea de copia si necesita realizar alguna personalización única e inevitable:

  [...]   [...]  maven-antrun-plugin   deploy       run       [...]  

Al contestar esta pregunta, me estoy enfocando en los detalles de lo que preguntaste. ¿Cómo copio un archivo? La pregunta y el nombre de la variable me llevan a preguntas más amplias como: “¿Hay alguna manera mejor de lidiar con el aprovisionamiento de servidores?” Utilice Maven como un sistema de comstackción para generar artefactos desplegables, luego realice estas personalizaciones en módulos separados o en otro lugar completamente distinto. Si compartió un poco más de su entorno de comstackción, podría haber una forma mejor: hay complementos para aprovisionar una cantidad de servidores. ¿Podría adjuntar un conjunto desempaquetado en la raíz del servidor? ¿Qué servidor estás usando?

De nuevo, estoy seguro de que hay una mejor manera.

   ...  org.apache.maven.plugins maven-resources-plugin 2.3     src/main/java   **/*.properties    ...  

Para copiar un archivo, use:

   maven-resources-plugin 2.7   copy-resource-one install  copy-resources   ${basedir}/destination-folder   /source-folder  file.jar        

Para copiar la carpeta con subcarpetas usa la siguiente configuración:

   ${basedir}/target-folder   /source-folder true    

El complemento de dependencia maven me ahorró mucho tiempo acariciando las tareas ant y:

  org.apache.maven.plugins maven-dependency-plugin   install-jar install  copy     ... ... ...   ... true     

La dependencia: copiar es documental y tiene objectives más útiles, como desempaquetar.

Para un simple copy-tasks, puedo recomendar copy-rename-maven-plugin . Es sencillo y fácil de usar:

  ...    com.coderplus.maven.plugins copy-rename-maven-plugin 1.0   copy-file generate-sources  copy   src/someDirectory/test.environment.properties target/someDir/environment.properties        

Si desea copiar más de un archivo, reemplace la parte ... con

   src/someDirectory/test.environment.properties target/someDir/environment.properties   src/someDirectory/test.logback.xml target/someDir/logback.xml   

Además, puede especificar múltiples ejecuciones en múltiples fases si es necesario, el segundo objective es “cambiar el nombre”, que simplemente hace lo que dice mientras el rest de la configuración permanece igual. Para obtener más ejemplos de uso, consulte la Página de uso .

Nota : Este complemento solo puede copiar archivos, no directorios. (Gracias a @ james.garriss por encontrar esta limitación).

La solución de la ant anterior es más fácil de configurar, pero he tenido suerte usando maven-upload-plugin de Atlassian. No pude encontrar una buena documentación, así es como la uso:

   com.atlassian.maven.plugins maven-upload-plugin 1.1   ${project.build.directory}/${project.build.finalName}.${project.packaging}  ${jboss.deployDir} ${jboss.host} ${jboss.deployUrl}    

Las variables como “$ {jboss.host}” mencionadas anteriormente están definidas en mi ~ / .m2 / settings.xml y se activan utilizando perfiles maven. Esta solución no está restringida a JBoss, esto es lo que llamé mis variables. Tengo un perfil para desarrollador, prueba y en vivo. Entonces, para subir mi oído a una instancia de jboss en el entorno de prueba, ejecutaría:

 mvn upload:upload -P test 

Aquí hay un snipet de settings.xml:

  localhost username {Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1  ...   dev  localhost /opt/jboss/server/default/deploy/ scp://root@localhost    test  testserver ... 

Notas: El repo maven de Atlassian que tiene este complemento está aquí: https://maven.atlassian.com/public/

Recomiendo descargar las fonts y mirar la documentación interna para ver todas las características que proporciona el complemento.

`

Bueno, se supone que maven no es bueno para hacer tareas finas granulares, no es un lenguaje de scripting como bash o ant, es bastante declarativo, dices, necesito una guerra o un oído, y lo entiendes. Sin embargo, si necesita personalizar el aspecto de la guerra o el oído, tiene un problema. Simplemente no es procedimental como la ant, sino declarativa. Esto tiene algunos pros al principio, y podría tener muchas desventajas al final.

Supongo que el concepto inicial fue tener complementos finos, que “simplemente funcionan”, pero la realidad es diferente si haces cosas no estándar.

Sin embargo, si pones suficiente esfuerzo en tus poms y en algunos complementos personalizados, obtendrás un entorno de construcción mucho mejor que con ant por ejemplo (depende de tu proyecto, por supuesto, pero se vuelve cada vez más cierto para proyectos más grandes).

He tenido muy buena experiencia con copy-maven-plugin . Tiene una syntax mucho más conveniente y concisa en comparación con maven-resources-plugin.

Solo puedo suponer que su propiedad $ {project.server.config} es algo definido a la medida y está fuera del diseño del directorio estándar.

Si es así, entonces utilizaría la tarea de copia.

Una forma genérica de copiar archivos arbitrarios es utilizar la abstracción de transporte de Maven Wagon . Puede manejar varios destinos a través de protocolos como file , HTTP , FTP , SCP o WebDAV .

Hay algunos complementos que proporcionan instalaciones para copiar archivos mediante el uso de Wagon . Los más notables son:

  • Completo plugin de Maven Deploy

    Existe el objective del deploy-file . Es bastante inflexible pero puede hacer el trabajo.

    mvn deploy:deploy-file -Dfile=/path/to/your/file.ext -DgroupId=foo -DartifactId=bar -Dversion=1.0 -Durl= -DgeneratePom=false

    Una desventaja significativa de utilizar Maven Deploy Plugin es que está diseñado para funcionar con repositorys Maven. Asume una estructura y metadatos particulares. Puede ver que el archivo se coloca debajo de foo/bar/1.0/file-1.0.ext y se crean los archivos de sum de comprobación. No hay forma de evitar esto.

  • Complemento de Wagon Maven

    Use el objective de upload-single :

    mvn org.codehaus.mojo:wagon-maven-plugin:upload-single -Dwagon.fromFile=/path/to/your/file.ext -Dwagon.url=

    El uso de Wagon Maven Plugin para copiar es sencillo y parece ser el más versátil.

En los ejemplos anteriores, puede ser de cualquier protocolo compatible. Vea la lista de proveedores de Wagon existentes. Por ejemplo

  • copiando archivo localmente: file:///copy/to
  • copiando archivo al host remoto ejecutando SSH : scp://host:22/copy/to

Los ejemplos anteriores pasan los parámetros del complemento en la línea de comando. Alternativamente, los complementos se pueden configurar directamente en POM . Entonces la invocación será simplemente como mvn deploy:deploy-file@configured-execution-id . O puede estar ligado a una fase de construcción particular.

Tenga en cuenta que para que los protocolos como SCP funcionen necesitará definir una extensión en su POM :

  [...]   org.apache.maven.wagon wagon-ssh 2.12   

Si el destino al que está copiando requiere autenticación, las credenciales se pueden proporcionar a través de la configuración del Server . repositoryId / serverId pasado a los complementos debe coincidir con el servidor definido en la configuración.

Otra forma es agrupar estas cosas en un artefacto usando el plugin de ensamblaje. Luego puede usar el complemento de dependencia para descomprimir estos archivos donde desee. También hay objectives de copia en el complemento de dependencia para copiar artefactos.

Pude juntar varias fonts diferentes para esta respuesta:

 ...  atlassian Atlassian Repo https://maven.atlassian.com/content/repositories/atlassian-public  ...  com.atlassian.maven.plugins maven-upload-plugin 1.1  ...  com.atlassian.maven.plugins maven-upload-plugin 1.1  jira-repo  ${project.build.directory}/${project.build.finalName}.${project.packaging}  opt/jira/webapps  scp://root@jira   ... 

Desde ~/.m2/settings.xml :

 ...   jira-repo myusername mypassword   ... 

A continuación, ejecute el comando: (el -X es para depuración)

mvn -X upload:upload

Para resumir algunas de las buenas respuestas anteriores: Maven está diseñado para construir módulos y copiar los resultados en un repository de Maven. Cualquier copia de módulos en un directorio de implementación / instalación de instalador debe realizarse fuera del contexto de la funcionalidad central de Maven, por ejemplo, con el comando de copia Ant / Maven.

Intereting Posts