메이븐 중앙 저장소에 아티팩트 업로딩 - maven - uploading artifact to central repository
개요
java 기반의 오픈 소스 프로젝트를 하고 있다면 library jar 파일을 메이븐의 중앙 저장소에 올려서 다른 이들과 손쉽게 공유할 수 있습니다.
메이븐의 중앙 저장소에 올리려면 https://bintray.com/ 같은 대행 서비스를 사용할 수도 있고 저장소 관리 솔루션인 sonatype nexus 사에서 제공하는 OSSRH(Open Source Project Repository Hosting) 을 이용할 수도 있습니다.
저는 개인적인 필요로 인해 Java 로 JIRA의 REST API 를 구현한 라이브러리를 만들었고 이를 OSSRH 를 통해 메이븐 중앙 저장소에 올리는 과정에서 제대로 매뉴얼을 안 보고 상당한 삽질을 겪은지라 혹시 비슷한 경우를 겪게 되는 분을 위해 그 과정을 정리해 봅니다.
사전 준비 사항
프로젝트와 계정 생성
먼저 오픈 소스 프로젝트를 개설하고 pom.xml 을 만들고 여기에 groupID와 artifact id, version 과 부가 항목(name, description, url, license 은 옵션 항목이지만 중앙 저장소에 올리려면 필수)을 지정해 줍니다.
pom.xml
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lesstif</groupId>
<artifactId>jira-rest-api</artifactId>
<version>0.7.0</version>
<name>JIRA REST Client</name>
<description>A Java client library for integrating with the JIRA issue and bug tracking software.</description>
<url>https://github.com/lesstif/jira-rest-client</url>
<licenses>
<license>
<name>pache-2.0</name>
<url>https://opensource.org/licenses/Apache-2.0</url>
<distribution>repo</distribution>
</license>
</licenses>
<properties>
<!-- Generic properties -->
<java.version>1.6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
<!-- Test -->
<junit.version>4.11</junit.version>
</properties>
</project>
저는 lesstif.com 이라는 도메인을 소유하고 있으므로 다음과 같이 com.lesstif 를 groupID 로 지정했으며 도메인이 없을 경우 다음과 같이 사용하는 오픈소스 포탈(예: com.github.lesstif) 로 설정해도 됩니다.
<groupId>com.github.lesstif</groupId>
<artifactId>jira-rest-api</artifactId>
이제 소스를 구현하고 push 한 후에 deploy 할 준비가 되었다면 https://issues.sonatype.org/secure/Signup!default.jspa 에 연결하여 JIRA 계정을 생성합니다.
계정이 생성되면 이메일로 알림이 오고 JIRA 이슈를 등록 할 권한을 갖게 됩니다.
이제 https://issues.sonatype.org/projects/OSSRH 에 연결하여 CREATE 를 눌러서 지라 이슈를 하나 등록합니다.
이슈 등록시 https://issues.sonatype.org/browse/OSSRH-19670 처럼 프로젝트의 이름과 groupId, URL 등의 정보를 입력하면 이슈가 생성되고 몇 일이 지나면 OSSRH 프로젝트 운영자가 해당 이슈의 상태를 Resolved 로 바꾸고 댓글을 달아주면 배포 사전 준비가 끝납니다.
distributionManagement 설정
이제 pom.xml 의 distributionManagement 항목에 다음과 같이 OSSRH 저장소 정보를 설정해 줍니다.
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
그리고 $HOME/.m2/settings.xml 의 servers 항목에 위에서 만든 계정과 암호를 설정해 줍니다.
$HOME/.m2/settings.xml
<servers>
<server>
<id>ossrh</id>
<username>myuserName</username>
<password>myPassword</password>
<configuration>
</configuration>
</server>
</servers>
snapshot 을 deploy 해서 테스트 해보기 위해 version 항목에 -SNAPSHOT 을 붙이고 다음 명령어를 실행해 봅니다.
mvn clean deploy
정상적으로 deploy 가 되었다면 https://oss.sonatype.org/content/repositories/snapshots/com/lesstif/ 에 연결하여 확인해 볼 수 있습니다.
GPG 키 생성
메이븐 중앙 저장소에 올라오는 library 는 위변조를 방지하기 위해 GPG 키로 전자 서명하게 되어 있습니다.
윈도 사용자는 https://www.gpg4win.org/ 에서 gpg4win 을 다운로드 받아서 File -> New Certificate 메뉴에서 Key Pair 를 생성하고 이름과 이메일을 넣어줍니다.
생성이 완료되었으면 Export Certificate 를 클릭해서 공개키를 *.asc 파일로 저장한 후에 이 파일을 http://pgp.mit.edu/ 에 업로드합니다.
GPG 키는 중요하므로 꼭 백업해 두세요.
deploy
javadoc 과 source jar
중앙 저장소에는 source jar와 javadoc와 필요하므로 pom.xml 에 maven-source-plugin, maven-javadoc-plugin 을 추가합니다.
물론 javadoc 이 제대로 생성되려면 사전에 소스에 주석을 달아놓아야 합니다.
pom.xml
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
gpg-sign
deploy 시 GPG 로 jar 파일 위변조를 확인하므로 deploy 시 gpg 서명을 추가하기 위해 gpg-plugin 설정을 합니다.
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
settings.xml 에는 위에서 생성한 gpg 개인키의 passphrase 를 설정해 줍니다.
settings.xml
<profiles>
<profile>
<id>myprofile</id>
<properties>
<gpg.passphrase>myPassword</gpg.passphrase>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>myprofile</activeProfile>
</activeProfiles>
deploy
이제 deploy 명령을 실행하면 모든 요구 조건이 맞을 경우 중앙 저장소에 올라 갑니다.
만약 소스에 주석이 없거나 pom.xml 에 프로젝트 정보와 라이선스가 없거나 gpg 서명에 실패하는 경우 maven 의 에러 메시지를 읽어 보면 쉽게 처리가 가능합니다.
mvn clean deploy