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

219 lines
6.3 KiB
Markdown

# `maven-publish` 플러그인
Gradle의 `maven-publish` 플러그인은 프로젝트의 빌드 아티팩트(예: JAR, POM 파일)를 **Maven 형식**으로 패키징하고 로컬 또는 원격 저장소(예: Maven Central, Artifactory, Nexus)에 배포할 때 사용된다.
이 플러그인은 다음과 같은 기능을 제공한다.
* Maven 저장소에 라이브러리 배포
* 로컬 및 원격 저장소 지원
* 자동 POM 파일 생성
* 다양한 아티팩트 유형(JAR, Sources, Javadoc) 지원
먼저 `maven-publish` 플러그인을 적용해야 한다.
`build.gradle.kts`
```kotlin
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` :
```kotlin
publishing {
publications {
create<MavenPublication>("mavenJava") {
from(components["java"])
groupId = "com.example"
artifactId = "my-library"
version = "1.0.0"
}
}
repositories {
maven {
url = uri("${buildDir}/repo") // 로컬 저장소 경로
}
}
}
```
로컬 저장소에 배포 실행 :
```sh
gradle publish
```
실행하면 `${buildDir}/repo/com/example/my-library/1.0.0/` 경로에 JAR과 POM 파일이 생성된다.
## 원격 Maven 저장소에 배포
Maven Central 또는 사설 저장소(Nexus, Artifactory)에 업로드하려면 **인증 정보**를 추가해야 한다.
`build.gradle.kts` :
```kotlin
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"
}
}
}
}
```
다음 명령어를 실행하면 원격 저장소에 업로드된다.
```sh
gradle publish
```
## 추가 아티팩트 (소스 코드, Javadoc)
라이브러리를 배포할 때 **소스 코드 및 Javadoc JAR**을 함께 제공할 수도 있다.
`build.gradle.kts`
```kotlin
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 파일
```