# Publicación de paquetes de Java con Maven

En este tutorial, aprenderá a usar Maven para publicar paquetes de Java en un registro como parte del flujo de trabajo de integración continua (CI).

## Introducción

Esta guía te muestra cómo crear un flujo de trabajo que publique paquetes de Java en GitHub Packages y en el Repositorio Central de Maven. Con un solo flujo de trabajo, puedes publicar los paquetes en un solo repositorio o en varios repositorios.

> \[!WARNING] Los ejemplos usados en esta guía hacen referencia al servicio OSSRH heredado. Consulta [Publicación](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing) en la documentación del repositorio central de Maven.

## Prerrequisitos

Te recomendamos que tengas una comprensión básica de los archivos de flujo de trabajo y las opciones de configuración. Para más información, consulta [Escritura de flujos de trabajo](/es/enterprise-server@3.22/actions/how-tos/write-workflows).

Para obtener más información sobre cómo crear un flujo de trabajo de CI para el proyecto de Java con Maven, consulte [Creación y prueba de Java con Maven](/es/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-maven).

También puede ser útil tener un entendimiento básico de lo siguiente:

* [Trabajar con el registro de Apache Maven](/es/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [Almacenamiento de información en variables](/es/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [Uso de secretos en Acciones de GitHub](/es/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [Uso de GITHUB\_TOKEN para la autenticación en flujos de trabajo](/es/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## Acerca de la configuración del paquete

Los campos `groupId` y `artifactId` del archivo *pom.xml* crean un identificador único para el paquete que los registros usan para vincular el paquete a un registro. Para obtener más información, consulta [Guía para cargar artefactos en el repositorio central](https://maven.apache.org/repository/guide-central-repository-upload.html) en la documentación de Apache Maven.

> \[!WARNING] El paquete de Apache Maven debe seguir la convención de nomenclatura y, por tanto, el campo `artifactId` solo debe contener letras minúsculas, dígitos o guiones. Para obtener más información, consulta [Convención de nomenclatura de coordenadas de Maven](https://maven.apache.org/guides/mini/guide-naming-conventions.html) en la documentación de maven.apache.org. Si usas letras en mayúsculas en el nombre del artefacto, obtendrás una respuesta *422 Unprocessable Entity*.

El archivo *pom.xml* también contiene la configuración de los repositorios de administración de distribución en los que Maven implementará los paquetes. Cada repositorio debe tener un nombre y una URL de implementación. La autenticación para estos repositorios se puede configurar en el archivo *.m2/settings.xml* del directorio de inicio del usuario que ejecuta Maven.

Puedes usar la acción `setup-java` para configurar el repositorio de implementación, así como la autenticación para ese repositorio. Para más información, vea [`setup-java`](https://github.com/actions/setup-java).

## Publicar paquetes en el repositorio central de Maven

Cada vez que crees un lanzamiento nuevo, puedes desencadenar un flujo de trabajo para publicar tu paquete. El flujo de trabajo del ejemplo siguiente se ejecuta cuando se desencadena el evento `release` con el tipo `created`. El flujo de trabajo publica el paquete en el repositorio central de Maven si se superan las pruebas de CI. Para obtener más información sobre el evento `release`, consulta [Eventos que desencadenan flujos de trabajo](/es/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release).

En este flujo de trabajo, puedes usar la acción `setup-java`. Esta acción instala la versión especificada del JDK en `PATH`, pero también configura un archivo *settings.xml* de Maven para publicar los paquetes. De forma predeterminada, el archivo de configuración se configurará para GitHub Packages, pero se puede configurar para implementarlo en otro registro de paquetes, como el repositorio central de Maven. Si ya tienes un repositorio de administración de distribución configurado en *pom.xml*, puedes especificar ese `id` durante la invocación de la acción `setup-java`.

Por ejemplo, si vas a realizar la implementación en el repositorio central de Maven mediante el proyecto de hospedaje OSSRH, en *pom.xml* se podría especificar un repositorio de administración de distribución con el `id` de `ossrh`.

```xml copy
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>ossrh</id>
      <name>Central Repository OSSRH</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>
```

Con esta configuración, puedes crear un flujo de trabajo que publique el paquete en el repositorio central de Maven especificando la administración de repositorio `id` en la acción `setup-java`. También deberás proporcionar variables de entorno que contengan el nombre de usuario y la contraseña para autenticarse en el repositorio.

En el paso de implementación, necesitarás establecer las variables de entorno para el nombre de usuario con el que te autenticaste en el repositorio y para el secreto que hayas configurado con la contraseña o el token con que autenticarse. Para más información, consulta [Uso de secretos en Acciones de GitHub](/es/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

```yaml copy
name: Publish package to the Maven Central Repository
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Maven Central Repository
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
```

Este flujo de trabajo realiza los siguientes pasos:

1. Revisa una copia del repositorio del proyecto.
2. Configura el JDK de Java y también configura el archivo maven *settings.xml* para agregar autenticación para el repositorio de `ossrh` mediante las variables de entorno `MAVEN_USERNAME` y `MAVEN_PASSWORD`.
3. Ejecuta el comando `mvn --batch-mode deploy` para publicar en el repositorio `ossrh`. La variable de entorno `MAVEN_USERNAME` se establecerá con el contenido del secreto `OSSRH_USERNAME` y la variable de entorno `MAVEN_PASSWORD` se establecerá con el contenido del secreto `OSSRH_TOKEN`.

   Para obtener más información sobre el uso de secretos en el flujo de trabajo, consulta [Uso de secretos en Acciones de GitHub](/es/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

## Publicar paquetes en GitHub Packages

Cada vez que crees un lanzamiento nuevo, puedes desencadenar un flujo de trabajo para publicar tu paquete. El flujo de trabajo del ejemplo siguiente se ejecuta cuando se desencadena el evento `release` con el tipo `created`. El flujo de trabajo publica el paquete en GitHub Packages si se superan las pruebas de CI. Para obtener más información sobre el evento `release`, consulta [Eventos que desencadenan flujos de trabajo](/es/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release).

En este flujo de trabajo, puedes usar la acción `setup-java`. Esta acción instala la versión especificada del JDK en `PATH`y también configura un *settings.xml* de Maven para publicar el paquete GitHub Packagesen . El archivo *settings.xml* generado define la autenticación de un servidor con un `id` de `github`, utilizando la variable de entorno `GITHUB_ACTOR` como nombre de usuario y la variable de entorno `GITHUB_TOKEN` como contraseña. A la variable de entorno `GITHUB_TOKEN` se le asigna el valor del secreto `GITHUB_TOKEN` especial.

El secreto `GITHUB_TOKEN` se establece en un token de acceso para el repositorio cada vez que comienza un trabajo en un flujo de trabajo. Debes establecer los permisos para este token de acceso en el archivo del flujo de trabajo a fin de conceder acceso de lectura al permiso `contents` y acceso de escritura al permiso `packages`. Para más información, consulta [Uso de GITHUB\_TOKEN para la autenticación en flujos de trabajo](/es/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token).

Para un proyecto basado en Maven, puede usar esta configuración mediante la creación de un repositorio de distribución en el archivo *pom.xml* con un `id` de `github` que apunta al punto de conexión de GitHub Packages.

Por ejemplo, si su organización se denomina "octocat" y el repositorio se denomina "hello-world", la GitHub Packages configuración de *pom.xml* tendría un aspecto similar al ejemplo siguiente.

```xml copy
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>github</id>
      <name>GitHub Packages</name>
      <url>https://maven.pkg.github.com/octocat/hello-world</url>
    </repository>
  </distributionManagement>
</project>
```

Con esta configuración, puede crear un flujo de trabajo que publique el paquete en GitHub Packages mediante el uso de la \_settings.xml\_generada automáticamente.

```yaml copy
name: Publish package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Este flujo de trabajo realiza los siguientes pasos:

1. Revisa una copia del repositorio del proyecto.
2. Configura el JDK de Java y también configura automáticamente el archivo maven *settings.xml* para agregar autenticación para el repositorio de `github` Maven para usar la variable de entorno `GITHUB_TOKEN`.
3. Ejecuta el comando `mvn --batch-mode deploy` para publicar en GitHub Packages. La variable de entorno `GITHUB_TOKEN` se establecerá con el contenido del secreto `GITHUB_TOKEN`. La clave `permissions` especifica el acceso concedido a `GITHUB_TOKEN`.

   Para obtener más información sobre el uso de secretos en el flujo de trabajo, consulta [Uso de secretos en Acciones de GitHub](/es/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

## Publicación de paquetes en el repositorio central de Maven y GitHub Packages

Puedes publicar tus paquetes tanto en Maven Central como en GitHub Packages usando la acción `setup-java` para cada registro.

Asegúrese de que el archivo *pom.xml* incluye un repositorio de administración de distribución para el GitHub repositorio y el proveedor del repositorio central de Maven. Por ejemplo, si implementa el repositorio central a través del proyecto de hospedaje de OSSRH, es posible que quiera especificarlo en un repositorio de administración de distribución con `id` establecido en `ossrh`, y que quiera especificar el GitHub Packages en un repositorio de administración de distribución con `id` establecido en `github`.

```yaml copy
name: Publish package to the Maven Central Repository and GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java for publishing to Maven Central Repository
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish to the Maven Central Repository
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
      - name: Set up Java for publishing to GitHub Packages
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Publish to GitHub Packages
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

Este flujo de trabajo llama a la acción `setup-java` dos veces. Cada vez que se ejecuta la acción `setup-java`, sobrescribe el archivo *settings.xml* de Maven para publicar los paquetes. Para la autenticación en el repositorio, el archivo *settings.xml* hace referencia al repositorio de administración de distribución `id` y al nombre de usuario y la contraseña.

Este flujo de trabajo realiza los siguientes pasos:

1. Revisa una copia del repositorio del proyecto.
2. Llama a `setup-java` por primera vez. Esto configura el archivo *settings.xml* de Maven para el repositorio `ossrh` y establece las opciones de autenticación en variables de entorno definidas en el paso siguiente.
3. Ejecuta el comando `mvn --batch-mode deploy` para publicar en el repositorio `ossrh`. La variable de entorno `MAVEN_USERNAME` se establecerá con el contenido del secreto `OSSRH_USERNAME` y la variable de entorno `MAVEN_PASSWORD` se establecerá con el contenido del secreto `OSSRH_TOKEN`.
4. Llama a `setup-java` por segunda vez. Esto configura automáticamente el archivo de Maven *settings.xml* para GitHub Packages.
5. Ejecuta el comando `mvn --batch-mode deploy` para publicar en GitHub Packages. La variable de entorno `GITHUB_TOKEN` se establecerá con el contenido del secreto `GITHUB_TOKEN`. La clave `permissions` especifica el acceso concedido a `GITHUB_TOKEN`.

   Para obtener más información sobre el uso de secretos en el flujo de trabajo, consulta [Uso de secretos en Acciones de GitHub](/es/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).