Construyendo tu propio repositorio maven:

Utilizando NEXUS

Oliver Fierro
4 min readApr 12, 2020

En esta serie de artículos, te mostraré cómo crear y gestionar tu propio repositorio privado de dependencias o librerías compartidas, para ser utilizadas dentro de tus proyectos. De esta forma, podrás además controlar de manera adecuada el ciclo de vida de estos artefactos.

Una librería compartida podría catalogarse como una funcionalidad especializada y empaquetada, de tal forma que pueda ser utilizada por varios proyectos como una dependencia externa. Típicamente las necesidades de tener una librería compartida surgen cuando en un equipo de desarrollo se construyen componentes que son utilitarios y que son de carácter transversal, es decir, varios componentes (microservicios u otros) se pueden beneficiar de dicha funcionalidad estándar. Por ejemplo un traductor de mensajería (de json a objeto Java o viceversa), un convertidor de horarios (de horario local al formato UTC o viceversa), un conector de arquitectura para abstraer la complejidad de integrarse a distintos orígenes y destinos (kafka, pubsub, jms, entre otros).

El otro factor que pudiera hacerte pensar en una librería como dependencia son restricciones para el uso de servicios rest por razones especificas de tu caso de negocio, del componente en si o de la infraestructura.

Es importante establecer un procedimiento para que los equipos de desarrollo puedan acceder a dichas librerías de forma expedita. Otro punto importante es que se propicie una comunidad que le dé soporte a los bug productivos y aporte a la evolución de dichas librerías.

En este contexto, presentaremos dos tipos de repositorio que podemos utilizar para este fin. Un repositorio en Nexus o un repositorio en un Bucket (Cloud Storage de Google Cloud Platform). Tu puedes incursionar en replicar este modelo en otros bucket de otras nubes (AWS, Azure) u otros gestores de repositorios (Artifactory)

Comenzaremos con la gestión de dependencias en un repositorio Nexus.

Utilizando un repositorio Nexus

Nexus es uno de los administradores de repositorios más populares en el mercado. Cuando la compañía quiere publicar una version especifica de algún driver (por ejemplo, un conector de una base de datos o a un servidor de aplicaciones) o una librería corporativa o el equipo de desarrollo necesita publicar un artefacto transversal al proyecto, puede utilizar Nexus como repositorio privado.

Vamos a la acción!

Requisitos:

Herramientas y software utilizado:

  • Intellij
  • Gradle 6.3+
  • Java 8

Repositorios:

https://github.com/oliverfierro77/nexus-publish

https://github.com/oliverfierro77/nexus-fetch

Subiendo una librería

[github: nexus-publish]

El procedimiento para subir una nueva librería, o una versión de ésta, al repositorio Nexus es muy sencillo. Basta con incorporar en el archivo build.gradle el plugin maven-publish y configurar el objeto publishing y repositories. A continuación se presenta un ejemplo:

build.gradle

plugins {
id ‘maven-publish
}
publishing {
publications {
maven(MavenPublication) {
artifact(“build/libs/$rootProject.name-$version”+”.jar”){
extension ‘jar’
}
}
}
repositories {
maven {
name ‘nexus’
url project.repoUrl
credentials {
username project.repoUser
password project.repoPassword
}
}
}
}

Podemos hacer referencia a las variables mencionadas, desde el archivo gradle.properties, de la siguiente manera:

gradle.properties

repoUrl=https://nexus.mycompany.com/repository/snapshot
repoUser=myuser
repoPassword=mypwd

Una buena práctica para proteger los datos sensibles, es utilizar variables de entorno. De esta manera evitas configurar dichas variables explícitamente en tus proyectos y no expones datos confidenciales. Si tienes un pipeline de CI/CD, éste lo puedes configurar para que dichas variables estén disponibles en el entorno al momento de la compilación.

repositories {
maven {
name ‘nexus’
url System.getenv(‘NEXUS_URL’)
credentials {
username System.getenv(‘NEXUS_USER’)
password System.getenv(‘NEXUS_PASSWORD’)
}
}
}

Para pruebas locales, las variables de entorno (NEXUS_URL, NEXUS_USER, NEXUS_PASSWORD) las puedes configurar desde un terminal de la siguiente manera:

[Mac]:

$ export NEXUS_URL=https://nexus.mycompany.com/repository/snapshot/
$ export NEXUS_USER=myuser
$ export NEXUS_PASSWORD=mypwd

Una vez que hayas ejecutado las variables de entorno, ejecuta:

$ gradle clean build publish

Ya tienes tu artefacto en el repositorio nexus listo para ser utilizado.

Descargando una libreria

[github: nexus-fetch]

Una vez que tenemos nuestras librerías en el repositorio nexus, podemos comenzar a utilizarlas desde nuestros proyectos. Para el proceso de descarga, debes hacer referencia en tu proyecto a la dependencia especifica que requieras y manteniendo la configuración del repositorio nexus dentro de los repositorios maven.

build.gradle

dependencies {
compile group: 'com.pudulabs', name: 'repositories', version:"${version}"
}
Referencia de dependencia “repositories”
Libreria descargada “repositories-1.0.0-SNAPSHOT.jar”

Como podemos observar, ya tenemos la librería “repositories” incorporada a nuestro proyecto y podemos comenzar a utilizar sus servicios como parte integra de nuestro entorno de desarrollo.

Nos vemos en el próximo capitulo, que por cierto estará muy entretenido, ya que nos adentraremos en el uso de Cloud Storage como repositorio maven.

Un abrazo!

Oliver Fierro

https://www.linkedin.com/in/oliverfierro/

--

--

Oliver Fierro

Cloud Architect & Tech Lead | Speaker & Writter | Co-organizer @GDG Cloud Santiago Chile