Plugins de Apache Maven

Conoce Maven

Maven es la principal herramienta de gestión y de construcción de dependencias líder para desarrolladores de Java™, ¡y por una buena razón! Estandariza el proceso de construcción de software articulando la constitución de los proyectos, implementándola como una aplicación y compartiéndola con otros proyectos.

Acerca de esta serie

¿Así que piensa que sabe acerca de la programación Java? El hecho es, que la mayor parte de los desarrolladores solo conoce la superficie de la plataforma Java, aprendiendo lo suficiente para hacer el trabajo. En esta serie continua, los detectives de la tecnología Java exploran la funcionalidad básica de la plataforma Java, descubriendo consejos y trucos que le pueden ayudar a solucionar incluso sus desafíos de programación más difíciles.

Maven emplea un robusto conjunto de plugins que brindan toda su funcionalidad. En Maven, los plugins tienen metas, que según el técnico son solo métodos Java. Las metas ejecutan tareas de construcción como: compilar el proyecto, empaquetarlo e implementarlo en un servidor local o remoto. Esas actividades se correlacionan perfectamente para construir fases del ciclo de vida.

Maven incluye sus plugins de construcción empaquetados y listos para usar, y los valores predeterminados son previamente configurados. La convención sobre la configuración asegura que la configuración se escale para la complejidad de la tarea dada. La mayor parte de las tareas de construcción requieren una configuración mínima.

Usted también puede configurar el comportamiento de los plugins de Maven. Es fácil sobrescribir los valores predeterminados de los complementos y definir nuevos valores utilizando el elemento de Maven <configuration>. Sin duda, los valores predeterminados sobrescritos son los valores de <source> y <target>.

¿Necesita pruebas? ¿Cuántas veces ha añadido el XML en el Listado 1 para que su POM establezca la versión de JVM correcta?

Configuración de la versión de Java en el plugin compilador

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.6.1</version>
   <configuration>
       <source>1.8</source>
       <target>1.8</target>
   </configuration> </plugin>

Cómo ejecutar el ciclo de vida de Maven

Cada objetivo del complemento se asigna a una fase de ciclo de vida de Mavene. La emisión del comando mvn compile instruye a la utilidad mvn para que llame a todas las metas ligadas a la fase del ciclo de vida compile. La meta compiler del plugin compile está ligada a esta fase del ciclo de vida.

La relación entre fase y meta es de una para muchos. Se pueden vincular varias ventas del plugin a la misma fase para formar una colección de tareas relacionadas. Las fases también son jerárquicas, lo que significa que la ejecución de una fase provoca la ejecución de todas las fases que la preceden.

En este caso, emitir el comando mvn compile inicia la fase validate (que es la primera fase del ciclo de vida de construcción predeterminado de Maven), lo que llama a todas las metas vinculadas con esa fase.

Los sitios web de Maven y Google Code mantienen una lista de los plugins de Maven. Esos plugins brindan varias funcionalidades útiles y que ahorran tiempo que usted puede incorporar a su proceso de construcción. Voy a presentar algunas de las más útiles que he encontrado y le voy a mostrar cómo sacar el máximo provecho de ellas.

1. Firmar digitalmente un JAR o un WAR

Haga clic en el botón siguiente para descargar el código de este ejemplo. Contiene una aplicación simple y un archivo POM con un plugin Jarsigner configurado.

None

Firmar digitalmente un JAR o un WAR es una tarea importante, especialmente si usted quiere distribuir su aplicación. Afortunadamente, la plataforma Java brinda una utilidad de firmado de archivos llamada jarsigner. Es una herramienta de línea de comandos que firma un archivo pasando la ubicación del archivo junto con sus parámetros diferentes, como el depósito de llaves que contiene sus llaves criptográficas.

Es posible encontrar jarsigner en la lista desplegable <%JAVA_HOME%>/bin de su instalación de JDK. El listado 2 muestra cómo firmar JAR con esta utilidad.

Cómo firmar un archivo con la utilidad jarsigner

jarsigner
    -keystore /path/to/keystore.jks
    -storepass <password>
    -keypass <key password>
    YourArchive.jar
    alias

Desde el primer momento, jarsigner es una herramienta de línea de comando. Pero, ¿no estaría bien automatizar el proceso de firmado, y hacer que el archivo se firme durante la fase empaquetar del ciclo de construcción? Es posible hacer esto gracias al plugin Maven Jarsigner, que encapsula la utilidad jarsigner. Todo lo que tiene que hacer es vincular el objetivo de la firma del plugin con la fase empaquetar de su construcción.

Para iniciar es necesario una clave. Si no tiene uno, puede crearlo en la utilidad keytool de la plataforma de Java, que se encuentra en el directorio <%JAVA_HOME%>/bin de su instalación de JDK.

Cómo crear un almacén de claves

Para crear un almacén de claves, navegue hasta la ubicación donde lo quiere y ejecute el comando del Listado 3. Asegúrese de reemplazar KeyAlias con un valor apropiado como su nombre de dominio. La documentación oficial de Oracle detalla más opciones de configuración que la herramienta acepta.

Cómo crear una clave para la utilidad jarsigner

keytool -genkey -alias <KeyAlias> -keyalg RSA -keystore keystore.jks -keysize 2048

El proceso de crear claves requiere que responda a una serie de preguntas acerca de usted mismo y de su organización, y que suministre una contraseña segura. Necesitará esta contraseña cuando configure el plugin de Maven Jarsigner, que es lo que hará a continuación.

Añada Jarsigner a su proceso de construcción

Ahora añadirá el plugin Maven Jarsigner a su ciclo de vida de construcción, a continuación lo configurará para firmar digitalmente JAR producido durante la fase de empaquetar. Tiene sentido conectarse a esta fase porque el JAR ya ha sido construido y almacenado en el directorio de salida predeterminado de su proyecto, que usualmente es el directorio objetivo. En el recuadro <plugins> de su archivo POM, añada el código que se muestra en el Listado 4.

Cómo añadir el plugin Jarsigner

<plugin>
   <groupId>org.apache.maven.plug-ins</groupId>
   <artifactId>maven-jarsigner-plugin</artifactId>
   <version>1.4</version>
</plugin>

Usted quiere firmar el JAR después de haberlo construido, así que necesita conectar el proceso de firmado (que está encapsulado en la meta firma) con la fase del ciclo de vida de empaquetar. Para hacerlo, añada el código al plugin en el Listado 5.

Cómo conectar la meta de la señal a la fase del paquete

<executions>
    <execution>
        <id>sign</id>
        <phase>package</phase>
        <goals>
            <goal>sign</goal>
        </goals>
    </execution>
</executions>

La firma necesita algunos detalles de la configuración para poder firmar digitalmente el JAR. Así que, entre los elementos de <configuración> usted debería añadir la ubicación del almacén de claves, el alias para las credenciales que quiere utilizar, la contraseña del almacén y la contraseña para las credenciales, tal como se muestra en el Listado 6.

Cómo especificar las credenciales de seguridad

<configuration>
   <keystore>/location/of/keystore.jks</keystore>
   <alias>KeyAlias</alias>
   <storepass>password</storepass>
   <keypass>password</keypass> </configuration>

Ésta es la configuración mínima necesaria para que funcione la función firmar JAR. Observe que el plugin brinda un espléndido rango de opciones de configuración adicionales entre las que escoger.

El paso final es construir el JAR y verificar que se ha firmado correctamente. Desde la línea de comando, ejecute la meta empaquetar de esta manera: mvn clean package. En la salida de la consola verá la construcción de JAR y luego como se firma. La imagen 1 muestra a lo que se puede parecer.

Resultado que muestra el archivo firmado

Captura de pantalla de la salida mostrando el archivo firmado

El JAR se construirá en del directorio de resultado de objetivo, y aquí es donde el plugin Jarsigner espera encontrarlo. El plugin firmará el JAR con las credenciales que usted ha proporcionado, después añadirá dos archivos adicionales al directorio META-INF: un archivo de firma con la extensión .SF y un archivo de bloque de firma con la extensión .RSA.

Ahora usted tiene un JAR firmado digitalmente y listo para su distribución.

Verifique la firma digital

Antes de distribuir el JAR, verifiquemos que se ha firmado adecuadamente. Puede hacer esto con la meta verificar de Maven Jarsigner, o a través de la línea de comando utilizando la herramienta jarsigner. En el Listado 7 he utilizado la herramienta de línea de comando y he pasado el archivo que quiero verificar.

Cómo utilizar la utilidad jarsigner para verificar un JAR firmado

jarsigner -verify target/YourJavaArchive.jar

Si tiene éxito, usted recibirá el mensaje: jar verificado.

Cómo firmar dos archivos WAR

Firmar un JAR no es el único truco que Jarsigner tiene en su manga. El plugin puede firmar cualquier archivo de Java, incluso los archivos WAR. Para ver cómo funciona esto, cambie el tipo de paquete de POM de JAR a WAR, añada el plugin Maven WAR (como se muestra en el Listado 8) y ejecute el comando: mvn clean package.

Cómo añadir el plugin Maven WAR

<plugin>
   <groupId>org.apache.maven.plug-ins</groupId>
   <artifactId>maven-war-plugin</artifactId>
   <version>3.1.0</version>
</plugin>

Seleccione el recuadro de selección de objetivo y descubrirá que el archivo WAR ha sido firmado.

Cómo firmar varios archivos

Si tiene que firmar más de un archivo, Jarsigner también puede encargarse de esa situación. El código del Listado 9 especifica la ubicación de los JARs a firmar como objetivo/todos, y se firmarán todos los JARs de este directorio.

Cómo especificar el directorio de un archivo

<archiveDirectory>target/all</archiveDirectory>

Si necesita tener un control más estricto sobre los archivos a firmar, puede utilizar comodines para incluir y excluir explícitamente los archivos como se muestra en el Listado 10.

Inclusión y exclusión de archivos seleccionados

<includes>
   <include>*1.0.jar</include>
</includes>
<excludes>
   <exclude>*SNAPSHOT.jar</exclude>
</excludes>

2. Implementar una aplicación web segura con Maven Cargo

Haga clic en el botón siguiente para descargar el código de este ejemplo. Contiene una aplicación web simple y un archivo POM con un plugin Cargo configurado.

None

La plugin Cargo de Codehaus es un envoltorio para la API de Cargo. La API está diseñada para configurar, iniciar, parar e implementar aplicaciones a varios contenedores soportados, así como también analizar, crear y modificar módulos de Java EE.

Una característica especialmente interesante es la capacidad de Cargo para especificar las propiedades del servidor de una forma agnóstica al contenedor. Dichas propiedades incluyen: puertos, credenciales de seguridad remotas, argumentos de JVM y -lo que es más relevante para nuestros intereses-; los detalles del inicio de sesión de la aplicación que quiere implementar. El plugin soporta 14 los servidores más populares, hasta la edición más reciente de cada uno de ellos.

El plugin Cargo funciona mejor conectado a la fase empaquetar del ciclo de vida de Maven. También se puede ejecutar de forma independiente haciendo referencia al directorio de la meta ejecutar directamente: mvn cargo:run. La ejecución independiente asume que el proyecto ya ha sido empaquetado y que está listo para ser implementado.

Empecemos conectando la meta ejecutar de Cargo a la fase empaquetar, tal como se muestra en el Listado 11.

Cómo conectar la meta ejecutar de Cargo a la fase empaquetar

<plugin>
   <groupId>org.codehaus.cargo</groupId>
   <artifactId>cargo-maven2-plugin</artifactId>
   <version>1.6.4</version>
   <executions>
       <execution>
           <phase>package</phase>
           <goals>
               <goal>run</goal>
           </goals>
       </execution>
   </executions>
</plugin>

Una vez hecha la integración de Maven necesitará configurar el contenedor en el que quiere que Cargo implemente la aplicación. Cargo soporta diferentes escenarios para los contenedores, lo que incluye la implementación de un servidor local o remoto que ya se está ejecutando (lo que incluye iniciar el servidor, si es necesario). Alternativamente, Cargo se puede configurar para: descargar, instalar, implementar e iniciar cualquiera de los 14 servidores que soporta.

Para este ejemplo utilizaré IBM® WebSphere® Liberty que ya he descargado y extraído a un directorio llamado servidores.

La configuración del contenedor espera al menos el ID del contenedor y la ubicación local del servidor instalado. El Listado 12 muestra la configuración de un servidor Liberty que está ubicado en mi directorio servers/wlp.

Configuración del contenedor

<configuration>
   <container>
       <containerId>liberty</containerId>
       <home>\path\to\servers\wlp</home>
   </container>
</configuration>

Descargue el ZIP del contenedor

Otra opción es especificar el URL del ZIP de Liberty en el sitio web de IBM, en cuyo caso el plugin de Cargo descargará e instalará el servidor. El Listado 13 muestra a lo que esto debería parecerse.

Cómo instalar el contenedor desde la web

<container>
   <containerId>liberty</containerId>
   <zipUrlInstaller>
       <url>
              https://public.dhe.ibm.com/ibmdl/export/pub/
              software/websphere/wasdev/downloads/wlp/17.0.0.2/
              wlp-webProfile7-17.0.0.2.zip
       </url>
       <downloadDir>/path/to/downloadDir</downloadDir>
       <extractDir>/path/to/extractDir</extractDir>
   </zipUrlInstaller>
</container>

La primera vez que ejecute la meta ejecutar, se descargará y se extraerá el archivo ZIP. En las ejecuciones posteriores Maven detectará que el archivo ya ha sido descargado e instalado, y se saltará esa tarea.

Ahora tiene una configuración de bare-bones, que puede probar implementando la aplicación en su servidor. Inicie el proceso llamando a la fase empaquetar (mvn package). La aplicación será compilada, empaquetada e implementada en el servidor y se puede encontrar en el URL: http://localhost:8080/{artifactid}/index.html.

Personalice la raíz del contexto

De forma predeterminada artifactid se utiliza para nombrar la raíz del contexto de la aplicación web. En algunos casos usted necesitará especificar una raíz personalizada para el contexto. En el Listado 14 he identificado la raíz del contexto como inicio.

Personalización de la raíz del contexto

<deployables>
   <deployable>
       <properties>
           <context>home</context>
       </properties>
   </deployable>
</deployables>

Cuando se implementa la aplicación se puede acceder a ella en: localhost:8080/home/index.html.

Especifique los inicios de sesión de los usuarios

Ahora tiene un proceso de implementación bastante robusto que descarga e instala un servidor e implementa su aplicación en una raíz personalizada para el contexto. Pero esto es tan solo el principio de lo que el plugin Cargo puede realizar.

Cargo realmente muestra su valía cuando empezamos a definir las propiedades de la configuración. Como he mencionado antes, esas son las propiedades del contenedor, como: puerto, protocolo, y lo que es más interesante, los detalles del inicio de sesión.

Vamos añadir un usuario a la aplicación de muestra y a forzar el inicio de sesión en el sitio. Para simplificar utilizaremos el método de autentificación básico, el cual requiere una configuración mínima en el archivo web.xml de la aplicación. web.xml. El Listado 15 muestra la especificación del rol del usuario y una restricción del recurso web WelcomeServlet.

Cómo declarar el rol del usuario

<web-app version="3.1"...>

   <security-constraint>
       <web-resource-collection>
           <web-resource-name>Welcome Servlet</web-resource-name>
           <url-pattern>/WelcomeServlet/*</url-pattern>
           <http-method>GET</http-method>
       </web-resource-collection>

       <auth-constraint>
           <role-name>user-role</role-name>
       </auth-constraint>
   </security-constraint>

   <login-config>
       <auth-method>BASIC</auth-method>
       <realm-name>file</realm-name>
   </login-config>

   <security-role>
       <role-name>user-role</role-name>
   </security-role>

</web-app>

Es posible configurar el plugin Cargo para crear un usuario para el rol del usuario, lo que se realiza sobre la marcha en el momento de la implementación. El Listado 16 muestra un nombre de usuario y una contraseña que se definen para el rol del usuario. En nombre del usuario es usuario y la contraseña es user123!.

Definición de un nombre de usuario y una contraseña

<configuration>
   <properties>
      <cargo.servlet.users>
         user:user1234!:user-role
      </cargo.servlet.users>
   </properties>
</configuration>

El formato para la propiedad <cargo.servlet.users> es nombre de usuario:contraseña:rol. Al separar el conjunto con el símbolo de una línea vertical, puede declarar varios usuarios para roles iguales y diferentes dentro de una única propiedad:

nombre de usuario1:contraseña1:rol11,...,rol1N|nombre de usuario2:contraseña2:rol21,...,rol2N|...

Ahora que tiene el nombre de usuario y la contraseña asignados al rol del usuario, está listo para empaquetar e implementar la aplicación. Con tan solo un comando; mvn clean package ; su aplicación web será compilada, empaquetada e implementada en el contenedor de Liberty. También se iniciará el servidor.

Si navega hasta el URL http://localhost:8080/home/WelcomeServlet se le presentará un recuadro de inicio de sesión, tal como se muestra en la Imagen 2. Ingrese el nombre de usuario y la contraseña que están configurados en el plugin Cargo, y haga clic en Inicie la sesión para entrar en la aplicación.

El desafío del inicio de sesión

Captura de pantalla que muestra los campos de usuario y contraseña

3. Instale un JAR personalizado en su repositorio local

La forma tradicional para incluir JARs en su proyecto es crear un directorio en su proyecto y asegurarse de que está en el classpath. Con Maven no necesita hacer esto. En vez de requerir que usted ubique conjuntamente las JARs con su proyecto, Maven las almacena en un repositorio local aislado. Más tarde, su proyecto debe especificar una dependencia sobre esas JARs.

El repositorio local se rellena con las dependencias que se descargan desde el repositorio central de Maven. Esta es la nave nodriza de Maven y contiene miles de JARs populares y usados habituales. Pero, ¿y si el JAR que usted quiere utilizar no está en el central de Maven? Por supuesto que usted podría confiar en la solución tradicional e incluir su JAR directamente en su proyecto, pero entonces no se beneficiaría de la gestión de dependencias de Maven.

En vez de eso, puede utilizar el plugin la instalación de maven para instalar el JAR en su repositorio local de Maven. Primero, necesitará descargar el plugin, a continuación, podrá ejecutar su meta instalar archivo. Este ejemplo es un poco diferente a los anteriores porque no conectará la meta a una fase del ciclo de vida de Maven. En vez de eso, especificará la meta en la herramienta de línea de comando de Maven.

La instalar archivo requiere de cinco parámetros que especifiquen la ubicación del archivo JAR, el grupo y artifactid, su número de versión y el tipo de paquete. El Listado 17 muestra la estructura del comando Maven.

Cómo instalar un JAR en el repositorio local de Maven

mvn install:install-file
    -Dfile=PATH/TO/YOUR-JAR.jar
    -DgroupId=GROUP-ID
    -DartifactId=ARTIFACT-ID
    -Dversion=VERSION
    -Dpackaging=jar

Para el JAR que usted desea instalar necesitará especificar valores para los parámetros mostrados. Pueden ser los que usted desee. Una vez ejecutados podrá ver por usted mismo que el archivo nuevo se almacena en su repositorio local de Maven. Navegue al directorio del repositorio /.m2/repository y encuentre la carpeta con el nombre GROUP-ID. Si el valor groupId es un nombre de dominio inverso como com.readlearncode, simplemente llegue al directorio com, a continuación navegue hacia readlearncode. Aquí es donde encontrará una carpeta que tendrá el número de versión del artefacto y el JAR instalado. La ubicación del JAR se puede parecer a esto: /.m2/repository/com/readlearncode/4.0/MyJar.jar.

Su JAR ahora está disponible para todos sus proyectos. Puede añadirlo a su POM de la forma usual como una dependencia, tal como se muestra en el Listado 18.

Cómo especificar su JAR como una dependencia

<dependency>
   <groupId>GROUP-ID</groupId>
   <artifactId>ARTIFACT-ID</artifactId>
   <version>VERSION</version>
</dependency>

4. Cree un repositorio Maven basado en GitHub

Haga clic en el siguiente botón para descargar el código de este ejemplo. Contiene una aplicación simple y un archivo POM con el site-maven-plugin configurado.

None

Hay muchas razones para alojar un repositorio de Maven en GitHub, entre ellas problemas de licencias, privacidad y el costo de los alojamientos comerciales. Independientemente de por qué usted elige alojar un repositorio Maven basado en GitHub, configurar uno es fácil.

Para empezar, cree una rama en un repositorio de GitHub existente e instale los artefactos de su proyecto directamente en la rama. Esto lo vinculará a la fase implementar del ciclo de vida de Maven, para que cuando el proyecto se implemente, el repositorio local se actualice automáticamente.

Añada las credenciales de GitHub

Después de que haya creado la rama de Maven en su repositorio de GitHub, necesitará añadir las credenciales de su repositorio de GitHub al archivo settings.xml de Maven. settings.xml. Este archivo normalmente se encuentra en el directorio .m2. Entre los elementos <servers> de settings.xml, tendrá que definir un servidor nuevo y especificar su nombre de usuario y su contraseña. El Listado 19 demuestra a qué se puede parecer esto (observe que he llamado al servidor nuevo github).

Configuración de un repositorio de github como un servidor

 <servers>
    <server>
        <id>github</id>
          <username>USERNAME_OR_EMAIL</username>
        <password>PASSWORD</password>
    </server>
 </servers>

Autenticación de Dos Factores

Si tiene activada la autenticación de dos factores, tendrá que crear un Token de Acceso Personal a través de sus Configuraciones de GitHub. Copie y pegue el token directamente en los elementos <password>. Para aumentar la seguridad se pueden cifrar las contraseñas siguiendo las instrucciones del sitio web de Maven.

Plug-in del sitio de Maven

En su Maven POM estará utilizando site-maven-plugin de Maven. La primera cosa que tiene que hacer es configurar un directorio base desde el que pueda asignar los archivos. Empiece creando un repositorio de preparación y localícelo en el directorio objetivo del proyecto, tal como se muestra en el Listado 20. Para este ejemplo, he llamado al mio repo-stage.

A continuación, ya que usted quiere conectar este plugin a la fase implementar tendrá que especificar la ubicación del repositorio en <altDeploymentRepository> de maven-deploy-plugin. El fragmento de código del Listado 20 muestra cómo se hace esto.

Cómo especificar el repositorio local alternativo

<plugin>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8.2</version>
   <configuration>
       <altDeploymentRepository>
              Repo.stage::default::file://
              ${project.build.directory}/repo-stage
       </altDeploymentRepository>
   </configuration>
</plugin>

Finalmente, necesita configurar el site-maven-plugin y conectarlo a la fase implementar. Para hacerlo, pase al plugin el id del servidor GitHub que había creado anteriormente. También es necesario pasar el nombre del repositorio y el propietario, la rama en la que está asignando los artefactos del proyecto y un comentario para la asignación. También necesita desactivar Jekyll, para que piense que tiene que generar páginas de GitHub.

El Listado 21 muestra una configuración completa de site-maven-plugin. Observe que el nombre del repositorio es dependency (Si la rama no existe, GitHub la creará).

Cómo configurar el plugin del sitio

<plugin>
   <groupId>com.github.github</groupId>
   <artifactId>site-maven-plugin</artifactId>
   <version>0.12</version>
   <configuration>
       <!-- Github settings -->
       <server>github</server>
       <repositoryName>MavenSampler</repositoryName>
       <repositoryOwner>atheedom</repositoryOwner>
       <branch>refs/heads/dependency</branch>
       <message>
         Artifacts for
         ${project.name}/${project.artifactId}/${project.version}
       </message>
       <noJekyll>true</noJekyll>
       <!-- Deployment values -->
       <outputDirectory>
              ${project.build.directory}/repo-stage
       </outputDirectory>
       <includes>
           <include>**/*</include>
       </includes>
   </configuration>
   <executions>
       <execution>
           <phase>deploy</phase>
           <goals>
               <goal>site</goal>
           </goals>
       </execution>
   </executions>
</plugin>

Lo único que falta por hacer es ejecutar el comando mvn clean deploy. En la consola verá al plugin subiendo los archivos de su repositorio a su cuenta de GitHub, creando la asignación y empujándola a la rama de la dependencia (dependency). La ventana de la consola debería parecerse a la Imagen 3.

Ventana de la consola para una asignación exitosa

Captura de pantalla de salida de consola para una confirmación exitosa

Para verificar que todo funciona como debería, visite su repositorio de GitHub y seleccione la rama dependency. Usted debería ver todos los artefactos de su proyecto, tal como se muestran en la Imagen 4.

Captura de pantalla del repositorio de Maven en GitHub

Captura de pantalla mostrando el repositorio de Maven en GitHub

Una vez que haya confirmado que esos artefactos se han asignado de forma segura a su repositorio GitHub Maven, querrá compartir el repositorio nuevo con otros que quieran depender de su proyecto.

Añada GitHub como repositorio

Los suscriptores que quieran especificar su repositorio GitHub Maven como repositorio remoto para sus propios proyectos tendrán que declarar el repositorio en su POM, tal como se muestra en el Listado 22. Después, usted especificará los artefactos de su proyecto de la forma habitual, tal como se muestra en el Listado 23.

Cómo especificar GitHub como repositorio remoto

<repositories>
   <repository>
       <id>PROJECT_NAME-dependency</id>
       <url>
              https://raw.github.com/
              GITHUB_USERNAME/PROJECT_NAME/dependency
       </url>
       <snapshots>
           <enabled>true</enabled>
           <updatePolicy>always</updatePolicy>
       </snapshots>
   </repository>
</repositories>

Dependencia del proyecto

<dependency>
   <groupId>com.readlearncode</groupId>
   <artifactId>maven-sampler</artifactId>
   <version>1.0</version>
</dependency>

Ahora tiene una versión inferior de un repositorio Maven público en el que implementar sus dependencias y compartirlas con el mundo.

5. Más consejos y trucos que ahorran tiempo

Apache Maven se usa tanto que encontrar consejos y trucos desconocidos es cómo buscar oro. Así que he decidido finalizar con una colección de golosinas que he encontrado extremadamente útiles. Es posible que entre ellas encuentre algunas pepitas que le ahorren tiempo y frustración.

Un ‘Roomba’ para dependencias no utilizadas

Desarrollar es algo emocionante, especialmente cuando hay que jugar con APIs y tecnologías nuevas. Maven también hace que sea rápido y fácil entrar en algo nuevo: Todo lo que tiene que hacer es copiar y pegar la dependencia en su archivo POM y ya está listo. A veces los desarrolladores nos dejamos llevar por el entusiasmo y olvidamos eliminar dependencias utilizadas; o somos demasiado perezosos para hacerlo. A medida que pasa el tiempo, este mal hábito puede cargar su POM y ralentizar las implementaciones.

Así que, mi primer consejo es el equivalente de Maven a la aspiradora robótica, Roomba. Simplemente ejecute el comando del Listado 24 y Maven analizará el código de su proyecto para encontrar dependencias no utilizadas y para identificarlas.

Identificar dependencias no utilizadas

dependency:analyze

Purgar el repositorio local

De vez en cuando, necesitará purgar su repositorio de Maven; quizás por la corrupción o si su IDE está indexando muy lentamente. Cualquiera que sea la causa, es posible eliminar toda la suciedad ejecutando el código del Listado 25.

Purgar el repositorio local

mvn dependency:purge-local-repository

Esto purgará y descargará automáticamente todas las dependencias para su proyecto actual. Su proyecto se sentirá renacido y listo para volver a superar su propio rendimiento.

¡Calcúlelo!

Añadir un registro de tiempo a su compilación puede ser muy útil. Maven 2 presentó la variable de la compilación maven.build.timestamp, que denota el inicio de la compilación. Es posible utilizar esta variable en cualquier lugar de su POM con la variable ${maven.build.timestamp}.

El sello temporal se formatea utilizando la clase SimpleDateFormat de Java y se declara con la propiedad <maven.build.timestamp.format>. El Listado 26 muestra un ejemplo de cómo hacer esto.

Formato del sello temporal

<properties>
    <maven.build.timestamp.format>
        yyyy-MM-dd'T'HH:mm:ss'Z'
    </maven.build.timestamp.format>
</properties>

Propiedades del reflejado

¿Ha querido usted saber alguna vez el valor de una propiedad de Maven? En vez de preguntárselo puede estar seguro con maven-antrun-plugin. Esta estupenda y pequeña herramienta refleja cualquier propiedad que pase a la consola.

En el Listado 27, la meta ejecutar de antrun se conecta a la fase validar de Maven (la primera fase predeterminada del ciclo de vida) y utiliza el elemento <echo> de la sección de configuración a imprimir los valores de las oportunidades.

Refleje una propiedad en dirección a la consola

<plugin>
   <groupId>org.apache.maven.plug-ins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.1</version>
   <executions>
       <execution>
           <phase>validate</phase>
           <goals>
               <goal>run</goal>
           </goals>
           <configuration>
               <tasks>
                   <echo>
                        settings.localRepository = ${settings.localRepository}
                   </echo>
                   <echo>
                        project.build.directory = ${project.build.directory}
                   </echo>
               </tasks>
           </configuration>
       </execution>
   </executions>
</plugin>

Ahora, simplemente puede utilizar mvn validate para ejecutar la fase validate y ver el resultado del valor de la propiedad de la consola.

Conclusión

Maven es mucho más que simplemente una herramienta de compilación, gracias a los plugins que simplifican y automatizan una amplia variedad de tareas de desarrollo. En este artículo he presentado un puñado de plugins y he ofrecido consejos para utilizarlos con la finalidad de lograr un ciclo de desarrollo más productivo y efectivo. Para saber aún más acerca de Maven y de su ciclo de vida del proyecto, vea «5 cosas que no sabía acerca de… Apache Maven,»que he actualizado recientemente para Maven 3.

Aviso

Aviso: el contenido aquí presentado fue traducido de la página IBM Developer US. Puede revisar el contenido original en este link de paquete. El Listado 17 muestra la estructura del comando Maven.

Cómo instalar un JAR en el repositorio local de Maven

mvn install:install-file
    -Dfile=PATH/TO/YOUR-JAR.jar
    -DgroupId=GROUP-ID
    -DartifactId=ARTIFACT-ID
    -Dversion=VERSION
    -Dpackaging=jar

Para el JAR que usted desea instalar necesitará especificar valores para los parámetros mostrados. Pueden ser los que usted desee. Una vez ejecutados podrá ver por usted mismo que el archivo nuevo se almacena en su repositorio local de Maven. Navegue al directorio del repositorio /.m2/repository y encuentre la carpeta con el nombre GROUP-ID. Si el valor groupId es un nombre de dominio inverso como com.readlearncode, simplemente llegue al directorio com, a continuación navegue hacia readlearncode. Aquí es donde encontrará una carpeta que tendrá el número de versión del artefacto y el JAR instalado. La ubicación del JAR se puede parecer a esto: /.m2/repository/com/readlearncode/4.0/MyJar.jar.

Su JAR ahora está disponible para todos sus proyectos. Puede añadirlo a su POM de la forma usual como una dependencia, tal como se muestra en el Listado 18.

Cómo especificar su JAR como una dependencia

<dependency>
   <groupId>GROUP-ID</groupId>
   <artifactId>ARTIFACT-ID</artifactId>
   <version>VERSION</version>
</dependency>

4. Cree un repositorio Maven basado en GitHub

Haga clic en el siguiente botón para descargar el código de este ejemplo. Contiene una aplicación simple y un archivo POM con el site-maven-plugin configurado.

None

Hay muchas razones para alojar un repositorio de Maven en GitHub, entre ellas problemas de licencias, privacidad y el costo de los alojamientos comerciales. Independientemente de por qué usted elige alojar un repositorio Maven basado en GitHub, configurar uno es fácil.

Para empezar, cree una rama en un repositorio de GitHub existente e instale los artefactos de su proyecto directamente en la rama. Esto lo vinculará a la fase implementar del ciclo de vida de Maven, para que cuando el proyecto se implemente, el repositorio local se actualice automáticamente.

Añada las credenciales de GitHub

Después de que haya creado la rama de Maven en su repositorio de GitHub, necesitará añadir las credenciales de su repositorio de GitHub al archivo settings.xml de Maven. settings.xml. Este archivo normalmente se encuentra en el directorio .m2. Entre los elementos <servers> de settings.xml, tendrá que definir un servidor nuevo y especificar su nombre de usuario y su contraseña. El Listado 19 demuestra a qué se puede parecer esto (observe que he llamado al servidor nuevo github).

Configuración de un repositorio de github como un servidor

 <servers>
    <server>
        <id>github</id>
          <username>USERNAME_OR_EMAIL</username>
        <password>PASSWORD</password>
    </server>
 </servers>

Autenticación de Dos Factores

Si tiene activada la autenticación de dos factores, tendrá que crear un Token de Acceso Personal a través de sus Configuraciones de GitHub. Copie y pegue el token directamente en los elementos <password>. Para aumentar la seguridad se pueden cifrar las contraseñas siguiendo las instrucciones del sitio web de Maven.

Plug-in del sitio de Maven

En su Maven POM estará utilizando site-maven-plugin de Maven. La primera cosa que tiene que hacer es configurar un directorio base desde el que pueda asignar los archivos. Empiece creando un repositorio de preparación y localícelo en el directorio objetivo del proyecto, tal como se muestra en el Listado 20. Para este ejemplo, he llamado al mio repo-stage.

A continuación, ya que usted quiere conectar este plugin a la fase implementar tendrá que especificar la ubicación del repositorio en <altDeploymentRepository> de maven-deploy-plugin. El fragmento de código del Listado 20 muestra cómo se hace esto.

Cómo especificar el repositorio local alternativo

<plugin>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8.2</version>
   <configuration>
       <altDeploymentRepository>
              Repo.stage::default::file://
              ${project.build.directory}/repo-stage
       </altDeploymentRepository>
   </configuration>
</plugin>

Finalmente, necesita configurar el site-maven-plugin y conectarlo a la fase implementar. Para hacerlo, pase al plugin el id del servidor GitHub que había creado anteriormente. También es necesario pasar el nombre del repositorio y el propietario, la rama en la que está asignando los artefactos del proyecto y un comentario para la asignación. También necesita desactivar Jekyll, para que piense que tiene que generar páginas de GitHub.

El Listado 21 muestra una configuración completa de site-maven-plugin. Observe que el nombre del repositorio es dependency (Si la rama no existe, GitHub la creará).

Cómo configurar el plugin del sitio

<plugin>
   <groupId>com.github.github</groupId>
   <artifactId>site-maven-plugin</artifactId>
   <version>0.12</version>
   <configuration>
       <!-- Github settings -->
       <server>github</server>
       <repositoryName>MavenSampler</repositoryName>
       <repositoryOwner>atheedom</repositoryOwner>
       <branch>refs/heads/dependency</branch>
       <message>
         Artifacts for
         ${project.name}/${project.artifactId}/${project.version}
       </message>
       <noJekyll>true</noJekyll>
       <!-- Deployment values -->
       <outputDirectory>
              ${project.build.directory}/repo-stage
       </outputDirectory>
       <includes>
           <include>**/*</include>
       </includes>
   </configuration>
   <executions>
       <execution>
           <phase>deploy</phase>
           <goals>
               <goal>site</goal>
           </goals>
       </execution>
   </executions>
</plugin>

Lo único que falta por hacer es ejecutar el comando mvn clean deploy. En la consola verá al plugin subiendo los archivos de su repositorio a su cuenta de GitHub, creando la asignación y empujándola a la rama de la dependencia (dependency). La ventana de la consola debería parecerse a la Imagen 3.

Ventana de la consola para una asignación exitosa

Captura de pantalla de salida de consola para una confirmación exitosa

Para verificar que todo funciona como debería, visite su repositorio de GitHub y seleccione la rama dependency. Usted debería ver todos los artefactos de su proyecto, tal como se muestran en la Imagen 4.

Captura de pantalla del repositorio de Maven en GitHub

Captura de pantalla mostrando el repositorio de Maven en GitHub

Una vez que haya confirmado que esos artefactos se han asignado de forma segura a su repositorio GitHub Maven, querrá compartir el repositorio nuevo con otros que quieran depender de su proyecto.

Añada GitHub como repositorio

Los suscriptores que quieran especificar su repositorio GitHub Maven como repositorio remoto para sus propios proyectos tendrán que declarar el repositorio en su POM, tal como se muestra en el Listado 22. Después, usted especificará los artefactos de su proyecto de la forma habitual, tal como se muestra en el Listado 23.

Cómo especificar GitHub como repositorio remoto

<repositories>
   <repository>
       <id>PROJECT_NAME-dependency</id>
       <url>
              https://raw.github.com/
              GITHUB_USERNAME/PROJECT_NAME/dependency
       </url>
       <snapshots>
           <enabled>true</enabled>
           <updatePolicy>always</updatePolicy>
       </snapshots>
   </repository>
</repositories>

Dependencia del proyecto

<dependency>
   <groupId>com.readlearncode</groupId>
   <artifactId>maven-sampler</artifactId>
   <version>1.0</version>
</dependency>

Ahora tiene una versión inferior de un repositorio Maven público en el que implementar sus dependencias y compartirlas con el mundo.

5. Más consejos y trucos que ahorran tiempo

Apache Maven se usa tanto que encontrar consejos y trucos desconocidos es cómo buscar oro. Así que he decidido finalizar con una colección de golosinas que he encontrado extremadamente útiles. Es posible que entre ellas encuentre algunas pepitas que le ahorren tiempo y frustración.

Un ‘Roomba’ para dependencias no utilizadas

Desarrollar es algo emocionante, especialmente cuando hay que jugar con APIs y tecnologías nuevas. Maven también hace que sea rápido y fácil entrar en algo nuevo: Todo lo que tiene que hacer es copiar y pegar la dependencia en su archivo POM y ya está listo. A veces los desarrolladores nos dejamos llevar por el entusiasmo y olvidamos eliminar dependencias utilizadas; o somos demasiado perezosos para hacerlo. A medida que pasa el tiempo, este mal hábito puede cargar su POM y ralentizar las implementaciones.

Identificar dependencias no utilizadas

dependency:analyze

Purgar el repositorio local

De vez en cuando, necesitará purgar su repositorio de Maven; quizás por la corrupción o si su IDE está indexando muy lentamente. Cualquiera que sea la causa, es posible eliminar toda la suciedad ejecutando el código del Listado 25.

Purgar el repositorio local

mvn dependency:purge-local-repository

Esto purgará y descargará automáticamente todas las dependencias para su proyecto actual. Su proyecto se sentirá renacido y listo para volver a superar su propio rendimiento.

¡Calcúlelo!

Añadir un registro de tiempo a su compilación puede ser muy útil. Maven 2 presentó la variable de la compilación maven.build.timestamp, que denota el inicio de la compilación. Es posible utilizar esta variable en cualquier lugar de su POM con la variable ${maven.build.timestamp}.

El sello temporal se formatea utilizando la clase SimpleDateFormat de Java y se declara con la propiedad <maven.build.timestamp.format>. El Listado 26 muestra un ejemplo de cómo hacer esto.

Formato del sello temporal

<properties>
    <maven.build.timestamp.format>
        yyyy-MM-dd'T'HH:mm:ss'Z'
    </maven.build.timestamp.format>
</properties>

Propiedades del reflejado

¿Ha querido usted saber alguna vez el valor de una propiedad de Maven? En vez de preguntárselo puede estar seguro con maven-antrun-plugin. Esta estupenda y pequeña herramienta refleja cualquier propiedad que pase a la consola.

En el Listado 27, la meta ejecutar de antrun se conecta a la fase validar de Maven (la primera fase predeterminada del ciclo de vida) y utiliza el elemento <echo> de la sección de configuración a imprimir los valores de las oportunidades.

Refleje una propiedad en dirección a la consola

<plugin>
   <groupId>org.apache.maven.plug-ins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.1</version>
   <executions>
       <execution>
           <phase>validate</phase>
           <goals>
               <goal>run</goal>
           </goals>
           <configuration>
               <tasks>
                   <echo>
                        settings.localRepository = ${settings.localRepository}
                   </echo>
                   <echo>
                        project.build.directory = ${project.build.directory}
                   </echo>
               </tasks>
           </configuration>
       </execution>
   </executions>
</plugin>

Ahora, simplemente puede utilizar mvn validate para ejecutar la fase validate y ver el resultado del valor de la propiedad de la consola.

Conclusión

Maven es mucho más que simplemente una herramienta de compilación, gracias a los plugins que simplifican y automatizan una amplia variedad de tareas de desarrollo. En este artículo he presentado un puñado de plugins y he ofrecido consejos para utilizarlos con la finalidad de lograr un ciclo de desarrollo más productivo y efectivo. Para saber aún más acerca de Maven y de su ciclo de vida del proyecto, vea «5 cosas que no sabía acerca de… Apache Maven,»que he actualizado recientemente para Maven 3.

Aviso

Aviso: el contenido aquí presentado fue traducido de la página IBM Developer US. Puede revisar el contenido original en este link