2025-02-22T01:13:24
This commit is contained in:
218
doc/12_maven-publish 플러그인.md
Normal file
218
doc/12_maven-publish 플러그인.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# `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 파일
|
||||
```
|
||||
Reference in New Issue
Block a user