Files
gradle-examples/doc/12_maven-publish 플러그인.md
2025-02-22 01:13:24 +09:00

6.3 KiB

maven-publish 플러그인

Gradle의 maven-publish 플러그인은 프로젝트의 빌드 아티팩트(예: JAR, POM 파일)를 Maven 형식으로 패키징하고 로컬 또는 원격 저장소(예: Maven Central, Artifactory, Nexus)에 배포할 때 사용된다.

이 플러그인은 다음과 같은 기능을 제공한다.

  • Maven 저장소에 라이브러리 배포
  • 로컬 및 원격 저장소 지원
  • 자동 POM 파일 생성
  • 다양한 아티팩트 유형(JAR, Sources, Javadoc) 지원

먼저 maven-publish 플러그인을 적용해야 한다.

build.gradle.kts

plugins {
    `maven-publish`
    `java-library`
    signing
}

group = "com.example"   // 그룹 ID
version = "1.0.0"       // 버전 정보

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.apache.commons:commons-lang3:3.12.0")
}
java {
    withJavadocJar()
    withSourcesJar()
}
publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"]) // Java 라이브러리 컴포넌트 사용
            groupId = "com.example"
            artifactId = "my-library"
            version = "1.0.0"
            pom {
                name = "My Library"
                description = "A concise description of my library"
                url = "http://www.example.com/library"
                properties = mapOf(
                    "myProp" to "value",
                    "prop.with.dots" to "anotherValue"
                )
                licenses {
                    license {
                        name = "The Apache License, Version 2.0"
                        url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
                    }
                }
                developers {
                    developer {
                        id = "johnd"
                        name = "John Doe"
                        email = "john.doe@example.com"
                    }
                }
                scm {
                    connection = "scm:git:git://example.com/my-library.git"
                    developerConnection = "scm:git:ssh://example.com/my-library.git"
                    url = "http://example.com/my-library/"
                }
            }
        }
    }
    repositories {
        maven {
            val releasesRepoUrl = layout.buildDirectory.dir("repos/releases")
            val snapshotsRepoUrl = layout.buildDirectory.dir("repos/snapshots")
            url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl)
        }
    }
}
signing {
    sign(publishing.publications["mavenJava"])
}
tasks.javadoc {
    if (JavaVersion.current().isJava9Compatible) {
        (options as StandardJavadocDocletOptions).addBooleanOption("html5", true)
    }
}
  • plugins { maven-publish }maven-publish 플러그인 적용
  • publishing { publications { ... } } → 배포할 아티팩트 설정
  • from(components["java"])java 컴포넌트를 기반으로 자동 설정
  • groupId, artifactId, version → Maven 아티팩트 정보 지정

로컬 Maven 저장소에 배포

Gradle은 기본적으로 **로컬 저장소(~/.m2/repository)**를 지원한다.

build.gradle.kts :

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"])
            groupId = "com.example"
            artifactId = "my-library"
            version = "1.0.0"
        }
    }
    repositories {
        maven {
            url = uri("${buildDir}/repo") // 로컬 저장소 경로
        }
    }
}

로컬 저장소에 배포 실행 :

gradle publish

실행하면 ${buildDir}/repo/com/example/my-library/1.0.0/ 경로에 JAR과 POM 파일이 생성된다.

원격 Maven 저장소에 배포

Maven Central 또는 사설 저장소(Nexus, Artifactory)에 업로드하려면 인증 정보를 추가해야 한다.

build.gradle.kts :

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"])
            groupId = "com.example"
            artifactId = "my-library"
            version = "1.0.0"

            pom {
                name.set("My Library")
                description.set("This is an example library.")
                url.set("https://github.com/example/my-library")
                licenses {
                    license {
                        name.set("MIT License")
                        url.set("https://opensource.org/licenses/MIT")
                    }
                }
                developers {
                    developer {
                        id.set("dev123")
                        name.set("John Doe")
                        email.set("john@example.com")
                    }
                }
            }
        }
    }
    repositories {
        maven {
            name = "myRepo"
            url = uri("https://maven.example.com/repository/releases/")
            credentials {
                username = project.findProperty("mavenUser") as String? ?: "defaultUser"
                password = project.findProperty("mavenPassword") as String? ?: "defaultPassword"
            }
        }
    }
}

다음 명령어를 실행하면 원격 저장소에 업로드된다.

gradle publish

추가 아티팩트 (소스 코드, Javadoc)

라이브러리를 배포할 때 소스 코드 및 Javadoc JAR을 함께 제공할 수도 있다.

build.gradle.kts

tasks.register<Jar>("sourcesJar") {
    from(sourceSets.main.get().allSource)
    archiveClassifier.set("sources")
}

tasks.register<Jar>("javadocJar") {
    from(tasks.javadoc)
    archiveClassifier.set("javadoc")
}

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"])
            artifact(tasks["sourcesJar"]) // 소스 코드 추가
            artifact(tasks["javadocJar"]) // Javadoc 추가

            groupId = "com.example"
            artifactId = "my-library"
            version = "1.0.0"
        }
    }
}

배포 후 다음과 같은 파일이 생성된다.

my-library-1.0.0.jar       # 라이브러리 JAR
my-library-1.0.0-sources.jar  # 소스 코드 포함
my-library-1.0.0-javadoc.jar  # Javadoc 포함
my-library-1.0.0.pom       # POM 파일