메이븐 중앙 저장소에 아티팩트 업로딩 - 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 은 옵션 항목이지만 중앙 저장소에 올리려면 필수)을 지정해 줍니다.

 Click here to expand...
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 저장소 정보를 설정해 줍니다.

 Click here to expand...
	<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 항목에 위에서 만든 계정과 암호를 설정해 줍니다.

 Click here to expand...
$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 이 제대로 생성되려면 사전에 소스에 주석을 달아놓아야 합니다.

 Click here to expand...
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 설정을 합니다.

 Click here to expand...
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 를 설정해 줍니다.

 Click here to expand...
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



참고 자료