Creación de un repositorio maven interno accesible por SSH

0
22063

Creación de un repositorio maven interno accesible por SSH

1. Introducción

Dado su potencial, cada vez es más frecuente
encontrarse con proyectos que se apoyan en maven para ser desarrollados.
En Autentia lo utilizamos y en adictosaltrabajo ya hemos hablado alguna vez sobre él
en varias de sus facetas. Una de ellas es el repositorio de maven, entendiéndolo como el lugar donde maven encuentra las librerias y las dependencias que necesitamos para poder desarrollar el proyecto. En este tutorial
vamos a centrarnos en la creación de un repositorio interno a nuestra empresa, un lugar gestionado por maven donde poder colocar librerias y dependencias de tal modo que sean accesibles por todos los desarrolladores de nuestra empresa.

 

2. Problemática

Como ya hemos comentado una de las muchas cosas de las que maven se encarga es de descargar las librerias que necesitemos asi como sus dependencias. Sin embargo, más tarde o más temprano podemos encontrarnos con alguno de estos efectos colaterales derivados del propio uso de esta tecnología:

  • ¿qué ocurre si en nuestros proyectos necesitamos utilizar alguna librería desarrollada por un tercero que no existe en ningún repositorio público?

  • ¿cómo hacemos para distribuir librerías o wrappers creados por nosotros mismos entre los desarrolladores de nuestra empresa?

  • ¿qué ocurre si nuestra conexión a internet es lenta, intermitente, o preferimos darle otros usos más prioritarios?

 

3. Solución

En estos casos una buena idea es crear un repositorio de maven interno para los desarrolladores de nuestra empresa. De este modo solucionaremos los problemas presentados incluyendo todo aquello que vayamos a necesitar en nuestro propio repositorio.

 

4. Manos a la obra

Aunque la descarga de dependencias de un proyecto maven desde los repositorios se puede realizar a través de varias formas como http, https, ftp o scp voy a utilizar esta última por las siguientes razones:

  1. Mantener, administrar y proteger un servidor ssh requiere menos esfuerzo que un servidor web o un servidor ftp, siempre a mi parecer.
  2. Un servidor ssh maneja implícitamente la validación, y gracias a ella evitaremos que personas ajenas a nuestra empresa puedan acceder al repositorio.

 

Es por ello que para seguir este tutorial necesitaremos una máquina con un servidor ssh funcionando que pueda ser utilizada para montar nuestro repositorio.

 

4.1 Ficheros y directorios

Vamos a fijar 3 elementos que van a ser clave en la creación y posterior uso del repositorio:

  • El directorio en la máquina que contiene el servidor ssh donde dejar el repositorio de maven. Por ejemplo /var/maven/repository.

  • El fichero pom.xml del proyecto que estemos desarrollando, donde indicaremos entre otras cosas qué repositorios vamos a usar en el proyecto.

  • El fichero ~/.m2/settings.xml, donde configurar el usuario y la contraseña con los que vamos a acceder al repositorio de maven.

 

En este ejemplo el repositorio estará en la máquina servidorAutentiaMaven dentro del directorio /var/maven/repository

 

4.2 Creación del repositorio en el servidor

Basta con acceder a la máquina servidorAutentiaMaven y crear el directorio /var/maven/repository/

 

4.3 Edición del fichero pom.xml

Deberemos ir a la configuración de los repositorios que vamos a utilizar en el proyecto e incluir el nuestro de un modo similar a este:

<repositories>
	<repository>
		<id>servidorAutentiaMaven</id>
		<name>Repositorio de maven de Autentia</name>
		<url>scp://servidorAutentiaMaven/var/maven/repository</url>
	</repository>
</repositories>
		

Es muy importante que observéis el <id> y la <url>.

  • La etiqueta <id> está relacionada con una configuración que haremos en ~/.m2/settings.xml

  • En la etiqueta <url> indicamos el protocolo (scp), el nombre de la máquina (servidorAutentiaMaven) y el directorio donde encontrar el repositorio de maven (/var/maven/repository). Si por razones de seguridad o cualquier otra el puerto de escucha del servidor ssh no fuese el puerto por defecto, deberemos indicarlo de este modo:

<url>scp://servidorAutentiaMaven:<puerto>/var/maven/repository</url>

 

4.4 Edición del fichero ~/.m2/settings.xml

Si no existiese tendríamos que crearlo y dejar un contenido similar a este, salvo que adaptado a nuestro caso particular:

		
<?xml version="1.0" encoding="UTF-8"?>
<settings>
	<localRepository>/home/raul/.m2/repository</localRepository> 
	<servers>
		<server>
			<id>servidorAutentiaMaven</id>
			<username>raul</username> 
			<password>miclavesupersecreta</password>
		</server>
	</servers>
</settings>
		

Si existiese, habría que modificarlo y ajustarlo. Hay que tener en cuenta lo siguiente:

  • El contenido de la etiqueta <id> debe coincidir con el de la etiqueta <id> del fichero pom.xml para saber a qué servidor estamos haciendo referencia (podríamos tener más de uno)

  • En <username> y en <password> debemos poner el nombre de usuario y contraseña que vamos a utilizar al acceder a la maquina servidorAutentiaMaven

 

4.5 Probando que el repositorio funciona

Si hemos seguido los pasos anteriores podemos probar que el repositorio está bien creado y configurado con un sencillo ‘mvn compile‘ desde la linea de comandos:

$ mvn compile

[INFO] Scanning for projects…

[INFO] —————————————————————————-

[INFO] Building proyect

[INFO] task-segment: [compile]

[INFO] —————————————————————————-

[INFO] artifact org.apache.maven.plugins:maven-compiler-plugin: checking for updates from servidorAutentiaMaven

The authenticity of host ‘servidorAutentiaMaven’ can’t be established.

RSA key fingerprint is ef:ae:b0:0d:ea:c5:40:33:dc:2f:f9:e3:a5:4c:c4:24.

Are you sure you want to continue connecting? (yes/no): yes

[INFO] [resources:resources]

[INFO] Using default encoding to copy filtered resources.

Downloading: scp://servidorAutentiaMaven/var/maven/repository/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar

Downloading: http://repo1.maven.org/maven2/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar

Downloading: scp://servidorAutentiaMaven/var/maven/repository/com/sun/jdmk/jmxtools/1.2.1/jmxtools-1.2.1.jar

Downloading: https://maven-repository.dev.java.net/nonav/repository/com.sun.jdmk/jars/jmxtools-1.2.1.jar

Downloading: http://repo1.maven.org/maven2/com/sun/jdmk/jmxtools/1.2.1/jmxtools-1.2.1.jar

Downloading: scp://servidorAutentiaMaven/var/maven/repository/com/sun/jmx/jmxri/1.2.1/jmxri-1.2.1.jar

Downloading: https://maven-repository.dev.java.net/nonav/repository/com.sun.jmx/jars/jmxri-1.2.1.jar

Downloading: http://repo1.maven.org/maven2/com/sun/jmx/jmxri/1.2.1/jmxri-1.2.1.jar

Downloading: scp://servidorAutentiaMaven/var/maven/repository/javax/jms/jms/1.1/jms-1.1.jar

Downloading: https://maven-repository.dev.java.net/nonav/repository/javax.jms/jars/jms-1.1.jar

Downloading: http://repo1.maven.org/maven2/javax/jms/jms/1.1/jms-1.1.jar

Como veis conecta con servidorAutentiaMaven y trata de bajar las dependencias del proyecto.

 

5. Subiendo librerías de terceros al servidor

Hay veces que queremos usar librerías de terceros que no se encuentran en ningún repositorio remoto y que deberemos importar a nuestro repositorio local. Por ejemplo, las librerías de jta.

 

[5.1] JTA

Si intentamos utilizarlas y no las tenemos en nuestro repositorio local nos aparecerá un error como el siguiente:

[INFO] ————————————————————————

[ERROR] BUILD ERROR

[INFO] ————————————————————————

[INFO] Failed to resolve artifact.

Missing:

———-

1) javax.transaction:jta:jar:1.0.1B

Try downloading the file manually from:

http://java.sun.com/products/jta

Then, install it using the command:

mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta \

-Dversion=1.0.1B -Dpackaging=jar -Dfile=/path/to/file

Alternatively, if you host your own repository you can deploy the file there: mvn deploy:deploy-file -DgroupId=javax.transaction -DartifactId=jta \

-Dversion=1.0.1B -Dpackaging=jar -Dfile=/path/to/file \

-Durl=[url] -DrepositoryId=[id]

Para resolver este problema vamos a instalar las librerías en el repositorio de maven que hemos creado para que cualquier desarrollador de la empresa que las necesite pueda utilizarlas fácilmente. Maven ya nos da instrucciones para ello:

Try downloading the file manually from:

http://java.sun.com/products/jta

[…]

if you host your own repository you can deploy the file there:

mvn deploy:deploy-file -DgroupId=javax.transaction -DartifactId=jta \

-Dversion=1.0.1B -Dpackaging=jar -Dfile=/path/to/file \

-Durl=[url] -DrepositoryId=[id]

Descargamos la librería de http://java.sun.com/products/jta y ejecutamos un comando parecido a este:

mvn deploy:deploy-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=/home/raul/jta-1_0_1B-classes.zip -Durl=scp://servidorAutentiaMaven/var/maven/repository -DrepositoryId=servidorAutentiaMaven

Eso si, deberemos tener permisos de escritura en el directorio /var/maven/repository de la máquina servidorAutentiaMaven para poder instalar la librería

[5.2] JMXRI y JMXTools

Nos vamos a http://java.sun.com/products/JavaManagement/download.html y descargamos el enlace ‘JMX 1.2.1 Reference Implementation’.

Dentro del zip que hemos descargado, en el directorio lib/, encontraremos dos jar: jmxri.jar y jmxtools.jar. Los descomprimimos y los instalamos en el repositorio:

mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/home/raul/jmxtools.jar -Durl=scp://servidorAutentiaMaven/var/maven/repository -DrepositoryId=servidorAutentiaMaven

mvn deploy:deploy-file -DgroupId=com.sun.jmx -DartifactId=jmxri -Dversion=1.2.1 -Dpackaging=jar -Dfile=/home/raul/jmx-1_2_1-ri.zip -Durl=scp://servidorAutentiaMaven/var/maven/repository -DrepositoryId=servidorAutentiaMaven

[5.3] JMS

De un modo parecido al anterior nos vamos a http://java.sun.com/products/jms/docs.html y descargamos ‘Download the version 1.1 API Documentation, Jar and Source

Dentro del zip que hemos descargado, en el directorio lib/, encontraremos dos jar: javax.jms.jar y jms.jar. Descomprimimos el javax.jms.jar y lo instalamos:

mvn deploy:deploy-file -DgroupId=javax.jms -DartifactId=jms -Dversion=1.1 -Dpackaging=jar -Dfile=/home/raul/javax.jms.jar -Durl=scp://servidorAutentiaMaven/var/maven/repository -DrepositoryId= servidorAutentiaMaven

 

6. Conclusiones

Si utilizais maven para desarrollar proyectos la utilidad de un repositorio es clara, ya que os permitirá tener localizadas librerias de terceros que no estén en repositorios públicos y os permitirá poder compartir librerias o componentes creadas por vosotros mismos entre proyectos de una manera sencilla. Además como habeis podido ver a lo largo del tutorial crear y gestionar el repositorio es bastante sencillo.

Si incluir maven en vuestros proyectos es una buena idea, ¿no es tener un repositorio propio un buen complemento a esta buena idea?.

Espero que os sea de utilidad.

 

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad