Pregunta

Tengo los archivos de configuración y diversos documentos que desea copiar desde el entorno de desarrollo en el directorio dev-servidor utilizando Maven2. Extrañamente, Maven no parece fuerte a esta tarea.


Algunas de las opciones:

  • Uso simple de un copia tarea en Maven
  

<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>

  • Utilice el plug-in para ejecutar Ant copia de Ant.

  • Construir un artefacto de tipo zip , junto con el artefacto "principal" del POM que es generalmente de tipo jar , entonces unpack ese artefacto desde el repositorio en el directorio de destino.

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

  • plugin de Maven Asamblea - pero esto parece requerir una gran cantidad de definiciones manuales, cuando quiero hacer las cosas de forma sencilla y

  • "convencional".
  • Esta página incluso muestra cómo construir un plugin hacer copia!

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

  • maven-dependencia-plugin con copia , como se menciona a continuación.


Todos estos parecen innecesariamente ad hoc: Maven se supone que debe sobresalir en hacer estas tareas estándar sin problemas y molestias.

Cualquier consejo?

¿Fue útil?

Solución

No rehuir el plugin antRun. El hecho de que algunas personas tienden a pensar que Ant y Maven están en la oposición, no lo son. Utilice la tarea de copia si es necesario realizar alguna inevitable personalización de una sola vez:

<project>
  [...]
  <build>
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>deploy</phase>
            <configuration>
              <tasks>

                <!--
                  Place any Ant task here. You can add anything
                  you can add between <target> and </target> in a
                  build.xml.
                -->

              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Para responder a esta pregunta, yo estoy centrado en los detalles de lo que has pedido. ¿Cómo puedo copiar un archivo? La pregunta y el nombre de la variable me llevan a una serie de preguntas más grandes, como: "¿Hay una mejor manera de lidiar con el aprovisionamiento de servidores?" Maven utilizar como un sistema de construcción para generar artefactos de despliegue, a continuación, realizar cualquiera de estas personalizaciones en módulos independientes o en algún lugar completamente distinto. Si ha compartido un poco más de su entorno de compilación, puede haber una mejor manera - hay plugins para la provisión de una serie de servidores. ¿Podría colocar un ensamblado que se desembalado en la raíz del servidor? Qué servidor está utilizando?

Una vez más, estoy seguro de que hay una mejor manera.

Otros consejos

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include> **/*.properties</include>
            </includes>
        </resource>
    </resources>
    ...
</build>

Con el fin de copiar un archivo de uso:

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>copy-resource-one</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>

                    <configuration>
                        <outputDirectory>${basedir}/destination-folder</outputDirectory>
                        <resources>
                            <resource>
                                <directory>/source-folder</directory>
                                <includes>
                                    <include>file.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
           </executions>
        </plugin>

Para copiar carpeta con subcarpetas utilizar siguiente configuración:

           <configuration>
              <outputDirectory>${basedir}/target-folder</outputDirectory>
              <resources>          
                <resource>
                  <directory>/source-folder</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>  

El complemento de la dependencia Maven me salvó un montón de tiempo acariciar con las tareas de hormigas:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>install-jar</id>
            <phase>install</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>...</outputDirectory>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

El dependencia: copiar es documentend, y tiene objetivos más útiles, como desempacar.

Para una simple copia-tareas puedo recomendar copia renombrar-maven-plugin de . Es sencillo y fácil de usar:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>copy-file</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
              <destinationFile>target/someDir/environment.properties</destinationFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Si desea copiar más de un archivo, reemplazar la parte <sourceFile>...</destinationFile> con

<fileSets>
  <fileSet>
    <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
    <destinationFile>target/someDir/environment.properties</destinationFile>
  </fileSet>
  <fileSet>
    <sourceFile>src/someDirectory/test.logback.xml</sourceFile>
    <destinationFile>target/someDir/logback.xml</destinationFile>
  </fileSet>                
</fileSets>

Además puede especificar múltiples ejecuciones en varias fases, si es necesario, el segundo objetivo es "cambiar el nombre", que simplemente hace lo que dice, mientras que el resto de la configuración es el mismo. Para más ejemplos de uso se refieren a la Uso-Página .

Nota: : Este plugin sólo puede copiar archivos, no directorios. (Gracias a @ james.garriss para encontrar esta limitación.)

La solución hormiga anterior es más fácil de configurar, pero he tenido suerte con la experta en-carga-plugin desde Atlassian. No he podido encontrar una buena documentación, aquí es cómo lo uso:

<build>
  <plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
       <resourceSrc>
             ${project.build.directory}/${project.build.finalName}.${project.packaging}
       </resourceSrc>
       <resourceDest>${jboss.deployDir}</resourceDest>
       <serverId>${jboss.host}</serverId>
       <url>${jboss.deployUrl}</url>
     </configuration>
  </plugin>
</build>

Las variables como "$ {} jboss.host" hace referencia anteriormente se definen en mi ~ / .m2 / settings.xml y se activan mediante perfiles de Maven. Esta solución no está limitado a JBoss, esto es justo lo que el nombre de mi variables. Tengo un perfil de dev, prueba y en vivo. Así que para subir mi oreja a una instancia de JBoss en el entorno de prueba que ejecutaría:

mvn upload:upload -P test

Aquí está una snipet de settings.xml:

<server>
  <id>localhost</id>
  <username>username</username>
  <password>{Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1</password>
</server>
...
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <jboss.host>localhost</jboss.host> 
      <jboss.deployDir>/opt/jboss/server/default/deploy/</jboss.deployDir>
      <jboss.deployUrl>scp://root@localhost</jboss.deployUrl>
    </properties>
  </profile>
  <profile>
    <id>test</id>
    <properties>
       <jboss.host>testserver</jboss.host>
       ...

Notas: El repositorio Maven Atlassian que tiene este plugin está aquí: https://maven.atlassian.com/public/

Yo recomiendo la descarga de las fuentes y mirando a la documentación dentro para ver todas las características del plugin proporciona.

`

Bueno, no se supone experto para ser bueno en hacer tareas de grano fino, no es un lenguaje de script como bash o una hormiga, es más bien declarativo - se dice - que necesito una guerra, o una oreja, y se obtiene . Sin embargo, si usted necesita para personalizar la forma en la guerra o en el oído debe ser similar en el interior, tiene un problema. Simplemente no es de procedimiento como de hormigas, pero declarativa. Esto tiene algunas ventajas en el principio, y podría tener una gran cantidad de inconvenientes al final.

Creo que el concepto inicial era tener plugins finas, que "sólo trabajo", pero la realidad es diferente si haces cosas no estándar.

Si sin embargo se esfuerzan lo suficiente en sus poms y algunos plugins personalizados, obtendrá un mejor entorno de compilación con la hormiga como por ejemplo (que depende de proyecto, por supuesto, pero se vuelve más y más cierto para proyectos más grandes) .

He tenido muy buena experiencia con copiar-maven-plugin de . Tiene una sintaxis mucho más conveniente y concisa en comparación con maven-recursos-plugin.

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

Hay algunos enchufes que suministren funciones de copiar los archivos a través del uso de Wagon. Los más notables son:

  • Fuera de la caja Maven Plugin Implementar

    No es el objetivo deploy-file . Es bastante inflexibles, pero puede hacer el trabajo:

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

    desventaja importante del uso de Maven Deploy Plugin es que está designado para trabajar con repositorios Maven. Asume estructura y metadatos en particular. Se puede ver que el archivo se coloca bajo foo/bar/1.0/file-1.0.ext y archivos de control se crean. No hay manera de evitar esto.

  • carro Maven Plugin

    Utilice la upload-single objetivo :

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

    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 soportado. Ver la lista de carro Proveedores . Por ejemplo

  • archivo de la copia local: file:///copy/to
  • SSH archivo copiado a host remoto ejecutando: scp://host:22/copy/to


Los ejemplos anteriores pase plugin de parámetros en la línea de comandos. Como alternativa, los plugins se pueden configurar directamente en POM. A continuación, la invocación será simplemente como mvn deploy:deploy-file@configured-execution-id. O puede ser obligado a determinada fase de construcción.


Tenga en cuenta que para protocolos como SCP para trabajar tendrá que definir una extensión en su POM:

<build>
  [...]
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>2.12</version>
    </extension>
  </extensions>


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

Sólo puedo suponer que sus $ {} project.server.config propiedad es algo definido costumbre y se encuentra fuera de la estructura de directorios estándar.

Si es así, que haría uso de la tarea de copia.

Otra forma es agrupar estas cosas en un artefacto usando el plugin de montaje. A continuación, puede utilizar el plugin de dependencia para descomprimir estos archivos en los que desee. También hay copia goles en la dependencia plugin para copiar artefactos.

pude juntar un número de diferentes fuentes para esta respuesta:

...
<repository>
    <id>atlassian</id>
    <name>Atlassian Repo</name>
    <url>https://maven.atlassian.com/content/repositories/atlassian-public</url>
</repository>
...
<dependency>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
</dependency>
...
<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <serverId>jira-repo</serverId>
        <resourceSrc>
            ${project.build.directory}/${project.build.finalName}.${project.packaging}
        </resourceSrc>
        <resourceDest>opt/jira/webapps</resourceDest> <!-- note: no leading slash -->
        <url>scp://root@jira</url>
    </configuration>
</plugin>
...

De ~/.m2/settings.xml:

...
<servers>
  <server>
    <id>jira-repo</id>
    <username>myusername</username>
    <password>mypassword</password>
  </server>
</servers>
...

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

mvn -X upload:upload

Para resumir algunos de los finos 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 despliegue / instalador-entrada debe hacerse fuera del contexto de la funcionalidad central de Maven, por ejemplo con la Ant / Maven Copiar de comandos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top