deployment - que - Usando Maven para el despliegue
maven tutorial español pdf (5)
A continuación, POM ayudará a copiar el archivo jar desde el directorio de construcción del proyecto al servidor SFTP / FTP remoto.
- Utilice el comando mvn install -Dftp.password = contraseña
Como quiero pasar la contraseña desde el indicador de comandos por razones de seguridad, he usado -Dftp.password = contraseña Después de ejecutar el comando anterior, todos los archivos jar de la carpeta de destino del proyecto de Maven se implementarán en la carpeta MAVEN en server.com
<plugin> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<scp todir="[email protected]:/MAVEN/"
sftp="true" port="22" trust="true" password="${ftp.password}"
failonerror="false" verbose="true" passphrase="">
<fileset dir="${project.build.directory}">
<include name="*.jar" />
</fileset>
</scp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
</plugin>
Tengo esta tarea para el proyecto con 4 subproyectos anidados usando Maven:
- Para cada hijo: directorio de recursos de jarra, incluidas las dependencias del proyecto
- Subir al proyecto padre
- Con un solo comando extraiga todos los archivos creados en varios destinos remotos (instalación completa), que pueden incluir el servidor http, el servidor de aplicaciones, el servidor de archivos, etc. (en su mayoría * NIX). El destino se proporciona en el nivel de subproyecto
- También debería ser posible descomprimir / copiar del subproyecto individual (instalación parcial)
Los archivos no son Java - en su mayoría varios scripts y HTML
Estoy mirando los diversos complementos para ayudar con la tarea: ensamblaje, dependencia, antrun, descomprimir. La dependencia parece prometedora, pero necesito descomprimir no solo los archivos de dependencia, sino también el contenido del (sub) proyecto. Además, como no puedo realmente ajustar la operación al ciclo de vida de Maven, ¿cómo activaría la instalación remota? dependencia mvn: descomprimir? Eso no es muy descriptivo o intuitivo. ¿Es posible crear un objetivo personalizado (por ejemplo, proyecto: instalar) sin escribir un complemento?
Usar Maven es un estándar de la compañía, así que por favor no ofrezca alternativas. Estoy bastante atascado con lo que tengo.
Maven no está realmente diseñado para desplegar tarros en una ubicación remota; Su uso principal es compilar y empaquetar artefactos. Los objetivos de ensamblaje y dependencia se utilizan principalmente para recopilar dependencias y archivos para empaquetar en un artefacto.
Dicho esto, Maven tiene un objetivo de despliegue que utiliza un componente llamado vagón. Esto está destinado principalmente a desplegar en un repositorio de Maven. Existe un complemento llamado Cargo que se puede usar para implementar artefactos en un servidor remoto, pero que no explota el contenido del contenedor por sí solo (depende del servidor de aplicaciones de destino para hacer todo eso). Es posible que pueda extender la funcionalidad de Maven Wagon usted mismo.
Además, es posible empaquetar un ciclo de vida personalizado, pero eso está entrando en un mojo de Maven bastante bajo nivel (juego de palabras destinado).
Me gustaría usar el maven-assembly-plugin para hacer esto.
Se puede usar algo como esto para tomar los archivos de los proyectos secundarios y meterlos en los directorios de salida.
<assembly>
<id>xyzzy</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>../subproject1/target/</directory>
<outputDirectory>/foo</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>../subproject1/target/html-output/</directory>
<outputDirectory>/foo</outputDirectory>
<includes>
<include>*.html</include>
<include>*.js</include>
<include>*.css</include>
</includes>
</fileSet>
<fileSet>
<directory>../subproject2/target/</directory>
<outputDirectory>/bar</outputDirectory>
<includes>
<include>**/**</include>
</includes>
<excludes>
<exclude>**/*.exclude-this</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>
No funciona sin frase de contraseña.
<profile>
<id>publish</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>scp</id>
<phase>deploy</phase>
<configuration>
<tasks>
<scp todir="user@host:some/remote/dir"
sftp="true"
keyfile="${user.home}/.ssh/devel-deploy.id_dsa"
failonerror="false"
verbose="true"
passphrase="nopass"
>
<fileset dir="${project.build.directory}">
<include
name="${project.build.finalName}.${project.packaging}"/>
</fileset>
</scp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
Sin embargo, mi favorito es
<profile>
<id>upload-devel</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>upload-devel</id>
<phase>deploy</phase>
<configuration>
<target>
<exec executable="rsync" failonerror="false">
<arg value="-aiz" />
<arg value="${project.build.directory}/${project.artifactId}.${project.packaging}" />
<arg value="user@host:some/remote/dir/." />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
aunque no sé qué tan compatible es sobre diferentes plataformas.
Ok, creo que lo siguiente podría hacer lo que necesitas. El inconveniente de este enfoque es que habrá un intervalo entre cada implementación a medida que se ejecute la compilación posterior. ¿Es esto aceptable?
Defina un perfil en cada proyecto con el mismo nombre (diga "publicar"). Dentro de ese perfil, puede definir una configuración para usar el complemento antrun para entregar los archivos con FTP (ver más abajo).
En el proyecto principal, tendrá un elemento de módulos, que define cada proyecto como un módulo. Si ejecuta mvn install -P publish
, cada proyecto se construirá a su vez con el perfil de publicación habilitado y el artefacto final publicado en el destino durante la fase de instalación. Si necesita implementar archivos adicionales, modifique el element
inclusión según corresponda.
Tenga en cuenta que los parámetros para la tarea de FTP se han establecido como propiedades, esto les permite sobrescribirse desde la línea de comandos y / o heredarse de la POM principal.
<profiles>
<profile>
<id>publish</id>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<ftp action="send"
server="${ftp.host}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
depends="${ftp.depends}" verbose="${ftp.verbose}">
<fileset dir="${project.build.directory}">
<include
name="${project.build.finalName}.${project.packaging}"/>
</fileset>
</ftp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-commons-net</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.6.5</version>
</dependency>
</dependencies>
</plugin>
<properties>
<ftp.host>hostname</ftp.host>
<ftp.remotedir>/opt/path/to/install</ftp.remotedir>
<ftp.userid>user</ftp.userid>
<ftp.password>mypassword</ftp.password>
<ftp.depends>yes</ftp.depends>
<ftp.verbose>no</ftp.verbose>
</properties>
</profile>
</profiles>
Actualización: según su comentario: puede usar el complemento de dependencia para descargar cada dependencia, excepto que un padre no puede tener una dependencia en un hijo, y se construirá antes que el niño. Tendría que ser otro proyecto. También necesita tener en algún lugar la información sobre dónde implementarlos. En este momento, tiene la información de destino en los proyectos individuales, por lo que no es accesible en el proyecto de implementación.
Con este enfoque, puede definir múltiples perfiles en el nuevo proyecto, uno para cada artefacto. Cada perfil define una dependencia: copie la ejecución para obtener el jar y una ejecución antrun para uno de los proyectos. La configuración común (como las dependencias para el complemento antrun) se puede extraer de los perfiles. También tenga en cuenta que las propiedades se fusionarán si define varios perfiles, por lo que es posible que deba calificarlos con el nombre del artefacto, por ejemplo, ftp.artifact1.host
.
<profiles>
<profile>
<id>deploy-artifact1</id>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependency</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>name.seller.rich</groupId>
<artifactId>artifact1</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>false</overWrite>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/deploy-staging</outputDirectory>
<overWriteReleases>false</overWriteReleases>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ftp</id>
<phase>install</phase>
<configuration>
<tasks>
<ftp action="send"
server="${ftp.host}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
depends="${ftp.depends}" verbose="${ftp.verbose}">
<fileset dir="${project.build.directory} includes="deploy-staging/"/>
</ftp>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<properties>
<!--if the properties differ between targets, qualify them with the artifact name-->
<ftp.host>hostname</ftp.host>
<ftp.remotedir>/opt/path/to/install</ftp.remotedir>
<ftp.userid>user</ftp.userid>
<ftp.password>mypassword</ftp.password>
<ftp.depends>yes</ftp.depends>
<ftp.verbose>no</ftp.verbose>
</properties>
</profile>
</profiles>