Tengo archivos de configuración y varios documentos que quiero copiar del entorno de desarrollo al directorio del servidor de desarrollo usando Maven2. Curiosamente, Maven no parece fuerte en esta tarea.
Algunas de las opciones:
- Uso simple de una tarea de copia en Maven
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
Use el complemento Ant para ejecutar la copia desde Ant.
Construya un artefacto de tipo zip , junto con el artefacto "principal" del POM que generalmente es de tipo jar , luego desempaquete ese artefacto del repositorio en el directorio de destino.
Complemento de recursos de Maven, como se menciona a continuación.
Complemento Maven Assembly, pero esto parece requerir muchas definiciones manuales, cuando quiero hacer las cosas de manera simple y "convencional".
¡Esta página incluso muestra cómo crear un complemento para copiar!
Plugin de carga de Maven, como se menciona a continuación.
Maven-dependency-plugin con copia , como se menciona a continuación.
Todo esto parece innecesariamente ad hoc: se supone que Maven se destaca en hacer estas tareas estándar sin problemas ni molestias.
¿Algún consejo?
fuente
Respuestas:
No te alejes del complemento Antrun. Solo porque algunas personas tienden a pensar que Ant y Maven están en oposición, no lo están. Utilice la tarea de copia si necesita realizar alguna personalización única e inevitable:
Al responder a esta pregunta, me estoy centrando 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 grandes como: "¿Hay una mejor manera de lidiar con el aprovisionamiento del servidor?" Use Maven como un sistema de construcción para generar artefactos desplegables, luego realice estas personalizaciones en módulos separados o en otro lugar por completo. Si compartió un poco más de su entorno de compilación, podría haber una mejor manera: hay complementos para aprovisionar varios servidores. ¿Podría adjuntar un ensamblado desempaquetado en la raíz del servidor? ¿Qué servidor estás usando?
De nuevo, estoy seguro de que hay una mejor manera.
fuente
task
parámetro ahora está en desuso ( Plugin Antrun ). Debería usartarget
en su lugar (desde 1.5). Desafortunadamente hay ejemplos que mezclan esto; por ejemplo,target
parámetro yversion
<1.5.fuente
Para copiar un archivo use:
Para copiar una carpeta con subcarpetas, use la siguiente configuración:
fuente
<filtering>
para evitar cambios no deseados, por ejemplo, en archivos de script que usan${...}
variables.El complemento de dependencia de Maven me ahorró mucho tiempo acariciando tareas de hormigas:
La dependencia: la copia es documental y tiene objetivos más útiles como desempaquetar.
fuente
Para tareas simples de copia, puedo recomendar copy-rename-maven-plugin . Es sencillo y fácil de usar:
Si desea copiar más de un archivo, reemplace la
<sourceFile>...</destinationFile>
parte conAdemás, puede especificar ejecuciones múltiples en varias fases si es necesario, el segundo objetivo es "cambiar el nombre", que simplemente hace lo que dice mientras el resto 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).
fuente
La solución anterior es la más fácil de configurar, pero he tenido suerte con el complemento maven-upload-plugin de Atlassian. No pude encontrar buena documentación, así es como la uso:
Las variables como "$ {jboss.host}" mencionadas anteriormente están definidas en mi ~ / .m2 / settings.xml y se activan utilizando los perfiles de Maven. Esta solución no está limitada a JBoss, esto es justo lo que denominé mis variables. Tengo un perfil para dev, test y live. Entonces, para cargar mi oído a una instancia de jboss en un entorno de prueba, ejecutaría:
Aquí hay un fragmento de settings.xml:
Notas: El repositorio de Maven de Atlassian que tiene este complemento está aquí: https://maven.atlassian.com/public/
Recomiendo descargar las fuentes y consultar la documentación para ver todas las características que proporciona el complemento.
``
fuente
Bueno, se supone que maven no es bueno para hacer tareas granulares finas, no es un lenguaje de script como bash o ant, es más bien 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 en el interior, tiene un problema. Simplemente no es procesal como la hormiga, sino declarativo. Esto tiene algunas ventajas al principio y podría tener muchos inconvenientes al final.
Supongo que el concepto inicial era 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 pocos complementos personalizados, obtendrás un entorno de construcción mucho mejor como con Ant, por ejemplo (depende de tu proyecto, por supuesto, pero se vuelve cada vez más cierto para proyectos más grandes).
fuente
He tenido muy buena experiencia con copy-maven-plugin . Tiene una sintaxis mucho más conveniente y concisa en comparación con maven-resources-plugin.
fuente
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
oWebDAV
.Hay algunos complementos que proporcionan facilidades para copiar archivos mediante el uso de
Wagon
. Los más notables son:Fuera de la caja Maven Implementar Plugin
Ahí está el
deploy-file
objetivo. Es bastante inflexible pero puede hacer el trabajo:Una desventaja significativa de usar
Maven Deploy Plugin
es que está diseñado para trabajar con repositorios Maven. Asume una estructura y metadatos particulares. Puede ver que el archivo se coloca debajofoo/bar/1.0/file-1.0.ext
y se crean archivos de suma de comprobación. No hay forma de evitar esto.Complemento Wagon Maven
Usa el
upload-single
objetivo :El uso de
Wagon Maven Plugin
para copiar es sencillo y parece ser el más versátil.En los ejemplos anteriores
<url>
puede ser de cualquier protocolo compatible. Consulte la lista de proveedores de vagones existentes . Por ejemplofile:///copy/to
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 comomvn deploy:deploy-file@configured-execution-id
. O puede estar vinculado a una fase de construcción particular.Tenga en cuenta que para protocolos
SCP
que funcionen deberá definir una extensión en suPOM
:Si el destino al que está copiando requiere autenticación, se pueden proporcionar credenciales a través de la
Server
configuración .repositoryId
/serverId
pasado a los complementos debe coincidir con el servidor definido en la configuración.fuente
Solo puedo suponer que su propiedad $ {project.server.config} es algo personalizado y está fuera del diseño estándar del directorio.
Si es así, usaría la tarea de copia.
fuente
Otra forma es agrupar estas cosas en un artefacto utilizando el complemento de ensamblaje. Luego puede usar el complemento de dependencia para descomprimir estos archivos donde desee. También hay objetivos de copia en el complemento de dependencia para copiar artefactos.
fuente
Pude reunir varias fuentes diferentes para esta respuesta:
De
~/.m2/settings.xml
:Luego ejecute el comando: (-X es para depurar)
mvn -X upload:upload
fuente
Para resumir algunas de las buenas respuestas anteriores: Maven está diseñado para construir módulos y copiar los resultados a un repositorio de Maven. Cualquier copia de módulos a un directorio de implementación / entrada de instalador debe realizarse fuera del contexto de la funcionalidad principal de Maven, por ejemplo, con el comando de copia Ant / Maven .
fuente