# Maven을 사용하여 Java 패키지 게시

이 자습서에서는 Maven을 사용하여 CI(연속 통합) 워크플로의 일부로 레지스트리에 Java 패키지를 게시하는 방법을 알아봅니다.

## 소개

이 가이드에서는 GitHub Packages 및 Maven 중앙 리포지토리에 Java 패키지를 게시하는 워크플로를 만드는 방법을 보여 줍니다. 단일 워크플로를 사용하면 패키지를 단일 리포지토리 또는 여러 리포지토리에 게시할 수 있습니다.

> \[!WARNING] 이 가이드에 사용된 예제는 레거시 OSSRH 서비스를 참조하세요. Maven 중앙 리포지토리 문서의 [게시](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing)를 참조하세요.

## 필수 조건

워크플로 파일 및 구성 옵션을 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 [워크플로 작성](/ko/enterprise-server@3.22/actions/how-tos/write-workflows)을(를) 참조하세요.

Maven을 사용하여 Java 프로젝트에 대한 CI 워크플로를 만드는 방법에 대한 자세한 내용은 [Maven을 사용하여 Java 빌드 및 테스트](/ko/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-maven) 참조하세요.

또한 다음 사항을 기본적으로 이해하는 것이 유용할 수 있습니다.

* [Apache Maven 레지스트리 작업](/ko/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [변수에 정보 저장](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [워크플로에서 인증에 GITHUB\_TOKEN 사용](/ko/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## 패키지 구성 정보

`groupId` 파일의 `artifactId` 및 \_\_ 필드는 레지스트리에서 패키지를 특정 레지스트리에 연결하는 데 사용하는 고유한 식별자를 생성합니다. 자세한 내용은 Apache Maven 문서에서 [중앙 리포지토리에 아티팩트 업로드 가이드](https://maven.apache.org/repository/guide-central-repository-upload.html)를 참조하세요.

> \[!WARNING] Apache Maven 패키지는 명명 규칙을 따라야 하므로 `artifactId` 필드에 소문자, 숫자, 하이픈만 포함해야 합니다. 자세한 내용은 maven.apache.org 설명서에서 [Maven 좌표의 명명 규칙](https://maven.apache.org/guides/mini/guide-naming-conventions.html)을 참조 하세요. 아티팩트 이름에 대문자를 사용하면 *422 처리할 수 없는 엔터티* 응답이 표시됩니다.

*pom.xml* 파일에는 Maven에서 패키지를 배포할 배포 관리 리포지토리에 대한 구성도 포함되어 있습니다. 각 리포지토리에는 이름과 배포 URL이 있어야 합니다. 이러한 리포지토리에 대한 인증은 Maven을 실행하는 사용자의 홈 디렉터리에 있는 *.m2/settings.xml* 파일에서 구성할 수 있습니다.

이 `setup-java` 작업을 사용하여 해당 리포지토리에 대한 인증뿐만 아니라 배포 리포지토리를 구성할 수 있습니다. 자세한 내용은 [`setup-java`](https://github.com/actions/setup-java)를 참조하세요.

## Maven 중앙 리포지토리에 패키지 게시

새 릴리스를 만들 때마다 워크플로를 트리거하여 패키지를 게시할 수 있습니다. 아래 예제의 워크플로는 `release` 이벤트가 `created` 형식으로 트리거될 때 실행됩니다. 이 워크플로는 CI 테스트를 통과할 경우 Maven 중앙 리포지토리에 패키지를 게시합니다.
`release` 이벤트의 자세한 내용은 [워크플로를 트리거하는 이벤트](/ko/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)을(를) 참조하세요.

이 워크플로에서는 `setup-java` 작업을 사용할 수 있습니다. 이 작업은 지정된 버전의 JDK를 `PATH`에 설치하지만 패키지 게시를 위한 Maven \_settings.xml\_도 구성합니다. 기본적으로 설정 파일은 GitHub Packages구성되지만 Maven 중앙 리포지토리와 같은 다른 패키지 레지스트리에 배포하도록 구성할 수 있습니다. 이미 \_pom.xml\_에 배포 관리 리포지토리가 구성된 경우 `id` 작업 호출 중에 해당 `setup-java`를 지정할 수 있습니다.

예를 들어 OSSRH 호스팅 프로젝트를 통해 Maven 중앙 리포지토리에 배포하는 경우 \_pom.xml\_은 `id`가 `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>
```

이 구성을 사용하면 `id` 작업에 리포지토리 관리 `setup-java`를 지정하여 Maven 중앙 리포지토리에 패키지를 게시하는 워크플로를 만들 수 있습니다. 또한 리포지토리에 인증하기 위해 사용자 이름 및 암호를 포함하는 환경 변수를 제공해야 합니다.

배포 단계에서는 환경 변수를 리포지토리에 인증하는 사용자 이름 및 인증할 암호 또는 토큰으로 구성한 비밀로 설정해야 합니다. 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/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 }}
```

이 워크플로는 다음 단계를 수행합니다.

1. 프로젝트 저장소의 복사본을 체크아웃한다.
2. Java JDK를 설정하고 maven *settings.xml* 파일을 구성하여 `ossrh` 및 `MAVEN_USERNAME` 환경 변수를 사용하여 `MAVEN_PASSWORD` 리포지토리에 대한 인증을 추가합니다.
3. `mvn --batch-mode deploy` 명령을 실행하여 `ossrh` 리포지토리에 게시합니다. `MAVEN_USERNAME` 환경 변수는 `OSSRH_USERNAME` 비밀의 내용으로 설정되고, `MAVEN_PASSWORD` 환경 변수는 `OSSRH_TOKEN` 비밀의 내용으로 설정됩니다.

   워크플로에서 비밀을 사용하는 방법에 대한 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.

## GitHub Packages에 패키지 게시

새 릴리스를 만들 때마다 워크플로를 트리거하여 패키지를 게시할 수 있습니다. 아래 예제의 워크플로는 `release` 이벤트가 `created` 형식으로 트리거될 때 실행됩니다. 워크플로는 CI 테스트가 통과하면 GitHub Packages 패키지를 게시합니다.
`release` 이벤트의 자세한 내용은 [워크플로를 트리거하는 이벤트](/ko/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)을(를) 참조하세요.

이 워크플로에서는 `setup-java` 작업을 사용할 수 있습니다. 이 작업은 지정된 버전의 JDK를 `PATH`에 설치하고, 패키지를 \_\_ 에 게시하기 위한 Maven GitHub Packages도 설정합니다. 생성된 \_settings.xml\_은 `id` 환경 변수를 사용자 이름으로 사용하고 `github` 환경 변수를 암호로 사용하여 `GITHUB_ACTOR`가 `GITHUB_TOKEN`인 서버에 대한 인증을 정의합니다.
`GITHUB_TOKEN` 환경 변수에는 특수 `GITHUB_TOKEN` 비밀 값이 할당됩니다.

`GITHUB_TOKEN` 비밀은 워크플로의 작업이 시작될 때마다 리포지토리에 대한 액세스 토큰으로 설정됩니다.
`contents` 권한에 대한 읽기 권한을 부여하고 `packages` 권한에 대한 쓰기 권한을 부여하려면 워크플로 파일에서 이 액세스 토큰에 대한 사용 권한을 설정해야 합니다. 자세한 내용은 [워크플로에서 인증에 GITHUB\_TOKEN 사용](/ko/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)을(를) 참조하세요.

Maven 기반 프로젝트의 경우 \_\_ 엔드포인트를 가리키는 `id`의 `github`로 GitHub Packages 파일에 배포 리포지토리를 만들면 이러한 설정을 사용할 수 있습니다.

예를 들어 조직의 이름이 "octocat"이고 리포지토리의 이름이 "hello-world" GitHub Packages 인 경우 *pom.xml* 구성은 아래 예제와 유사합니다.

```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>
```

이 구성을 사용하면 자동으로 생성된 GitHub Packages사용하여 패키지를 게시하는 \_\_ 워크플로를 만들 수 있습니다.

```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 }}
```

이 워크플로는 다음 단계를 수행합니다.

1. 프로젝트 저장소의 복사본을 체크아웃한다.
2. Java JDK를 설정하고 Maven *settings.xml* 파일을 자동으로 구성하여 `github` Maven 리포지토리에 대한 인증을 추가하여 `GITHUB_TOKEN` 환경 변수를 사용합니다.
3. `mvn --batch-mode deploy` 명령을 실행하여 GitHub Packages에 게시합니다. `GITHUB_TOKEN` 환경 변수는 `GITHUB_TOKEN` 비밀의 내용으로 설정됩니다. `permissions` 키는 `GITHUB_TOKEN`에 부여된 액세스 권한을 지정합니다.

   워크플로에서 비밀을 사용하는 방법에 대한 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.

## Maven 중앙 리포지토리에 패키지 게시 및 GitHub Packages

각 레지스트리에 대해 GitHub Packages 작업을 사용하여 패키지를 Maven 중앙 리포지토리와 `setup-java` 모두에 게시할 수 있습니다.

*pom.xml* 파일에 리포지토리와 Maven Central 리포지토리 공급자 모두 GitHub 에 대한 배포 관리 리포지토리가 포함되어 있는지 확인합니다. 예를 들어 OSSRH 호스팅 프로젝트를 통해 중앙 리포지토리에 배포하는 경우, `id`를 `ossrh`로 설정한 배포 관리 리포지토리에서 이를 지정할 수 있으며, GitHub Packages를 `id`로 설정한 배포 관리 리포지토리에서 `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 }}
```

이 워크플로는 `setup-java` 작업을 두 번 호출합니다.
`setup-java` 작업이 실행될 때마다 패키지 게시를 위해 Maven *settings.xml* 파일을 덮어씁니다. 리포지토리 인증을 위해 *settings.xml* 파일은 리포지토리 관리 리포지토리 `id`, 사용자 이름, 암호를 참조합니다.

이 워크플로는 다음 단계를 수행합니다.

1. 프로젝트 저장소의 복사본을 체크아웃한다.
2. 처음으로 `setup-java`를 호출합니다. 이렇게 하면 \_\_ 리포지토리에 대한 Maven `ossrh` 파일이 구성되고 인증 옵션이 다음 단계에서 정의되는 환경 변수로 설정됩니다.
3. `mvn --batch-mode deploy` 명령을 실행하여 `ossrh` 리포지토리에 게시합니다. `MAVEN_USERNAME` 환경 변수는 `OSSRH_USERNAME` 비밀의 내용으로 설정되고, `MAVEN_PASSWORD` 환경 변수는 `OSSRH_TOKEN` 비밀의 내용으로 설정됩니다.
4. 두 번째로 `setup-java`를 호출합니다. 이렇게 하면 \_\_ 용 Maven GitHub Packages 파일이 자동으로 설정됩니다.
5. `mvn --batch-mode deploy` 명령을 실행하여 GitHub Packages에 게시합니다. `GITHUB_TOKEN` 환경 변수는 `GITHUB_TOKEN` 비밀의 내용으로 설정됩니다. `permissions` 키는 `GITHUB_TOKEN`에 부여된 액세스 권한을 지정합니다.

   워크플로에서 비밀을 사용하는 방법에 대한 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.