แแ แกแขแแขแแแจแ แแแแแ แแแขแแแฃแ แแ แจแแแฎแแแ Java แแ แขแแคแแฅแขแแก แแแแแฅแแแงแแแแแก แแ แแชแแกแก แแฃแแแแแ Github แแแฅแแแแแแแแแก แแแจแแแแแแ Sonatype Maven แชแแแขแ แแแฃแ แกแแชแแแจแ Gradle builder-แแก แแแแแงแแแแแแ.
แแ แกแขแแขแแแก แแแฌแแ แ แแแแแแฌแงแแแขแ แแ แ แแแแแแแก แแแ แแแแฃแ แ แแแแแแแแแแก แแ แแ แกแแแแแแก แแแแ. แงแแแแ แแแคแแ แแแชแแ แชแแ-แชแแแแ แฃแแแ แจแแแ แแแแแฃแแแงแ แกแฎแแแแแกแฎแแ แฌแงแแ แแแแ, แฃแคแ แ แแแขแแช, แแ แช แแฃ แแกแ แแฎแแแ. แแแกแแช แแแแขแแ แแกแแแก, แแแแแแ แแงแแก แแฅแแแแ แแแแ แซแแแแแ แแแขแแก แฅแแแจ.
แกแแชแแแแก แจแแฅแแแ Sonatype-แจแ
แแแ แแแแ แแแแแฏแ แแ แแก แกแแชแแแแก แจแแฅแแแ Sonatype Maven Central-แจแ. แแแแกแแแแก แแแแแแแแ แ
แแแแแกแขแฃแ แแแแแแ แแแ แแแแฃแแ แแ แแแก แจแแแแแ, แแฅแแแแ GroupId แจแแแฅแแแแแ แแ แฉแแแ แจแแแแแซแแแ แแแแแแแแแ แจแแแแแ แแขแแแแ, Gradle-แแก แแแแคแแแฃแ แแชแแแแ.
Gradle-แแก แแแแคแแแฃแ แแชแแ
แฌแแ แแก แแ แแก แแ แแแ แแแแแแ Gradle แแแแแแแขแแแ, แ แแแแแแแช แแแฎแแแ แแแแแแแ แแ แขแแคแแฅแขแแก แแแแแฅแแแงแแแแแก.
แแแ แแแแ, แ แแช แแแกแแ แแแแแแ, แแ แแก Sonatype-แแก แแแแฎแแแแแแ แแแแแชแแแแกแแแแก. แแกแแแ แจแแแแแแแ:
- แฌแงแแ แแก แแแแแแแกแ แแ JavaDoc-แแก แฎแแแแแกแแฌแแแแแแแ, แ.แ. แฃแแแ แแแแกแฌแ แแก
-sources.jar
ะธ-javadoc.jar
แคแแแแแแ. แ แแแแ แช แแแแฃแแแแขแแชแแแจแแ แแแแฅแแแแ, แแฃ แจแแฃแซแแแแแแแ แฌแงแแ แแก แแแแแแแก แแ แแแแฃแแแแขแแชแแแก แแแฌแแแแแ, แจแแแแซแแแแ แแแแแแแแ แขแงแฃแแแ-sources.jar
แแ-javadoc.jar
แแแ แขแแแ README แจแแแแแ แขแแกแขแแก แแแกแแแแแแแ. - แงแแแแ แคแแแแ แฃแแแ แแงแแก แฎแแแแแฌแแ แแแ
GPG/PGP
แแ.asc
แฎแแแแแฌแแ แแก แจแแแชแแแแ แคแแแแ แฃแแแ แแงแแก แฉแแ แแฃแแ แแแแแแฃแ แคแแแแแ. - ะะฐะปะธัะธะต
pom
แคแแแแ - แกแฌแแ แ แแแแจแแแแแแแแแ
groupId
,artifactId
ะธversion
. แแแ แกแแ แจแแแซแแแแ แแงแแก แแแแแแแแฃแ แ แกแขแ แแฅแแแ แแ แแ แจแแแซแแแแ แแแกแ แฃแแแแก-SNAPSHOT
- แแฃแชแแแแแแแแ แงแแคแแ
name
,description
ะธurl
- แแแคแแ แแแชแแแก แแ แกแแแแแ แแแชแแแแแแก, แแแแแแแแแ แแแแกแ แแ แแแ แกแแแแแก แแแแขแ แแแแก แกแแกแขแแแแก แจแแกแแฎแแ
แแก แแ แแก แซแแ แแแแแ แฌแแกแแแ, แ แแแแแแแช แฃแแแ แแแแชแแแ แแแแแฅแแแงแแแแแกแแก. แกแ แฃแแ แแแคแแ แแแชแแ แฎแแแแแกแแฌแแแแแแ
แฉแแแ แแแฎแแ แชแแแแแแ แแ แแแแฎแแแแแแก build.gradle
แคแแแแ. แแแ แแแ แ แแแจแ, แแแแแ แแแแแแแขแแ แงแแแแ แกแแญแแ แ แแแคแแ แแแชแแ แแแแแแแแแ แแแแก, แแแชแแแแแแแแก, แแแ แกแแแแแก แแแแขแ แแแแก แกแแกแขแแแแก แจแแกแแฎแแ แแ แแกแแแ แแแแแงแแแแ url, แกแแฎแแแ แแ แแ แแแฅแขแแก แแฆแฌแแ แ. แแแแแ แแแแฌแแ แแ แแแแกแแแแแก แแแ แขแแแ แแแแแแ:
def customizePom(pom) {
pom.withXml {
def root = asNode()
root.dependencies.removeAll { dep ->
dep.scope == "test"
}
root.children().last() + {
resolveStrategy = DELEGATE_FIRST
description 'Some description of artifact'
name 'Artifct name'
url 'https://github.com/login/projectname'
organization {
name 'com.github.login'
url 'https://github.com/login'
}
issueManagement {
system 'GitHub'
url 'https://github.com/login/projectname/issues'
}
licenses {
license {
name 'The Apache License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
scm {
url 'https://github.com/login/projectname'
connection 'scm:https://github.com/login/projectname.git'
developerConnection 'scm:git://github.com/login/projectname.git'
}
developers {
developer {
id 'dev'
name 'DevName'
email '[email protected]'
}
}
}
}
}
แจแแแแแแ, แแฅแแแ แฃแแแ แแแฃแแแแแ, แ แแ แฌแแ แแแฅแแแแแ แจแแแ แแแแก แแ แแก -sources.jar
ะธ-javadoc.jar
แคแแแแแแ. แแ แแแแงแแคแแแแแแกแแแแก java
แแฅแแแ แฃแแแ แแแแแแขแแ แจแแแแแแ:
java {
withJavadocJar()
withSourcesJar()
}
แแแแแ แแแแแแแแแ แแแแ แแแแฎแแแแแแ, GPG/PGP แฎแแแแแฌแแ แแก แแแงแแแแแแแ. แแแแกแแแแแก แแแแแแแจแแ แแ แแแแแแแขแ signing
:
plugins {
id 'signing'
}
แแ แแแแแแขแแ แแแแงแแคแแแแแ:
signing {
sign publishing.publications
}
แแ แแแแแก, แแแแแ แแแแแแแขแแ แแแแงแแคแแแแแ publishing
:
publishing {
publications {
mavenJava(MavenPublication) {
customizePom(pom)
groupId group
artifactId archivesBaseName
version version
from components.java
}
}
repositories {
maven {
url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
credentials {
username sonatypeUsername
password sonatypePassword
}
}
}
}
แแฅ sonatype แแแแฎแแแ แแแแแก แกแแฎแแแ ะธ sonatypePassword แชแแแแแแแ, แ แแแแแแแช แจแแแชแแแก แแแแแแก แแ แแแ แแแก, แ แแแแแแช แจแแแฅแแแ แ แแแแกแขแ แแชแแแก แแ แแก
แแแ แแแแ แคแแแแแ build.gradle
แแกแ แแแแแแงแฃแ แแแ:
แกแ แฃแแ build.gradle แแแแ
plugins {
id 'java'
id 'maven-publish'
id 'signing'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
withJavadocJar()
withSourcesJar()
}
group 'io.github.githublogin'
archivesBaseName = 'projectname'
version = System.getenv('RELEASE_VERSION') ?: "0.0.1"
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
}
test {
useJUnitPlatform()
}
jar {
from sourceSets.main.output
from sourceSets.main.allJava
}
signing {
sign publishing.publications
}
publishing {
publications {
mavenJava(MavenPublication) {
customizePom(pom)
groupId group
artifactId archivesBaseName
version version
from components.java
}
}
repositories {
maven {
url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
credentials {
username sonatypeUsername
password sonatypePassword
}
}
}
}
def customizePom(pom) {
pom.withXml {
def root = asNode()
root.dependencies.removeAll { dep ->
dep.scope == "test"
}
root.children().last() + {
resolveStrategy = DELEGATE_FIRST
description 'Some description of artifact'
name 'Artifct name'
url 'https://github.com/login/projectname'
organization {
name 'com.github.login'
url 'https://github.com/githublogin'
}
issueManagement {
system 'GitHub'
url 'https://github.com/githublogin/projectname/issues'
}
licenses {
license {
name 'The Apache License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
scm {
url 'https://github.com/githublogin/projectname'
connection 'scm:https://github.com/githublogin/projectname.git'
developerConnection 'scm:git://github.com/githublogin/projectname.git'
}
developers {
developer {
id 'dev'
name 'DevName'
email '[email protected]'
}
}
}
}
}
แแแแแ แแฆแแแแจแแ, แ แแ แฉแแแ แแแฆแแแ แแแ แกแแแก แแแ แแแแก แชแแแแแแแแ: System.getenv('RELEASE_VERSION')
. แฉแแแ แแแแแแแแแแแ แแแก แแกแแแแแแแก แแ แแก แแ แแแแฆแแแ แแแก แขแแแแก แกแแฎแแแแแแ.
PGP แแแกแแฆแแแแก แแแแแ แแชแแ
Sonatype-แแก แแ แ-แแ แแ แแแแฎแแแแแ, แ แแ แงแแแแ แคแแแแ แแงแแก แฎแแแแแฌแแ แแแ GPG/PGP แแแกแแฆแแแแ. แแแแกแแแแก แแแแแแแแ แ
- แฉแแแ แแฅแแแแ แแแกแแฆแแแแก แฌแงแแแแก:
gpg --gen-key
, แจแแแงแแแแแ แแแแฎแแแ แแแแแก แกแแฎแแแ, แแแคแแกแขแ แแ แแกแแแ แแแแงแแแแ แแแ แแแ. - แฉแแแ แแแแแแ
id
แฉแแแแ แแแกแแฆแแแ แแ แซแแแแแแ:gpg --list-secret-keys --keyid-format short
. Id แแแแแแแแฃแแ แแฅแแแแ แฎแแแแก แจแแแแแ, แแแแแแแแแ: rsa2048/9B695056 - แกแแ แแแ แแ แกแแฏแแ แ แแแกแแฆแแแแก แแแแแฅแแแงแแแแ
https://keys.openpgp.org แแ แซแแแแแแ:gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
- แฉแแแ แกแแแแฃแแแ แแแกแแฆแแแก แแฅแกแแแ แขแแ แแแขแแ แแแ แแแแแแแแฃแ แแแแแแแก, แแก แแแแแญแแ แแแแ แแแแแแแแจแ:
gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Github แแแฅแแแแแแแแแก แแแงแแแแแ
แแแแแ แแแแแแแแแ แคแแแแแฃแ แแขแแแแ, แแแแแงแแแแ build แแ แแแขแแแแขแฃแ แแ แแแแแแแฅแแแงแแแ Github Actions-แแก แแแแแงแแแแแแ.
Github Actions แแ แแก แคแฃแแฅแชแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแขแแแแขแแแแ แแแ แกแแแฃแจแแ แแแแแแแก แกแ แฃแแ CI / CD แชแแแแแก แแแแฎแแ แชแแแแแแแ. แจแแฅแแแ, แขแแกแขแแ แแแ แแ แแแแแ แแแ แจแแแซแแแแ แแแแแฌแแแฃแแ แแงแแก แกแฎแแแแแกแฎแแ แแแแแแแแ: แแแแแก แแแจแแแแ, แแแแแจแแแแแก แจแแฅแแแ แแ แแ แแแแแแแแ. แแก แคแฃแแฅแชแแ แแแกแแแฃแขแฃแ แแ แฃแคแแกแแ แกแแฏแแ แ แกแแชแแแแแแกแแแแก.
แแ แแแแงแแคแแแแแแจแ แแ แแแฉแแแแแแ, แแฃ แ แแแแ แฃแแแ แแแแงแแแแ build แแ Push แแแแ แแ แแแแแแแแแกแแ Sonatype-แแก แกแแชแแแจแ แแแแแจแแแแแกแแก, แแกแแแ แแแแงแแแแ แกแแแแฃแแแแแแแแ.
แฉแแแ แแแงแแแแแ แกแแแแฃแแแแแแแแก
แแแขแแแแขแฃแ แ แจแแแ แแแแกแ แแ แแแแแแแแแแกแแแแก, แฉแแแ แแแญแแ แแแแ แ แแแ แกแแแแฃแแแ แแแแจแแแแแแแแแ, แ แแแแ แแชแแ แแแกแแฆแแแแก ID, แแแ แแแ, แ แแแแแแช แจแแแแงแแแแแ แแแกแแฆแแแแก แแแแแ แแ แแแแกแแก, แแแแแ PGP แแแกแแฆแแแ แแ Sonatype แจแแกแแแ/แแแ แแแ. แแฅแแแ แจแแแแซแแแแ แแแแงแแแแ แแกแแแ แกแแแชแแแแฃแ แแแแงแแคแแแแแแจแ แกแแชแแแแก แแแ แแแแขแ แแแจแ:
แฉแแแ แแแแแงแแแแ แจแแแแแแ แชแแแแแแแ:
- SONATYPE_USERNAME / SONATYPE_PASSWORD - แจแแกแแแ / แแแ แแแ, แ แแแแแแช แจแแแแงแแแแแ Sonatype-แจแ แ แแแแกแขแ แแชแแแกแแก
- SIGNING_KEYID/SIGNING_PASSWORD โ PGP แแแกแแฆแแแแก ID แแ แแแ แแแ แแแงแแแแแฃแแแ แแแแแ แแ แแแแก แแ แแก.
แแแแแ แฃแคแ แ แแแขแแแฃแ แแ แแแกแแฃแแ แ GPG_KEY_CONTENTS แชแแแแแแ. แคแแฅแขแแ, แ แแ แแแแแฅแแแงแแแแแกแแแแก แฉแแแ แแแญแแ แแแแ แแแ แแแ PGP แแแกแแฆแแแ. แกแแแแฃแแแแแแจแ แแแแแฅแแแงแแแแแก แแแแแแ แแแแแแแงแแแ
- แแแแแ แแแแจแแคแ แแ แฉแแแแ แแแกแแฆแแแ gpg-แแ:
gpg --symmetric --cipher-algo AES256 9B695056.gpg
แแแ แแแแก แจแแงแแแแแ. แแก แฃแแแ แแแแแแแกแแแก แชแแแแแจแ: SECRET_PASSPHRASE - แแแแแ แแแแแแแแ แแแแแ แแแฆแแแฃแแ แแแจแแคแ แฃแแ แแแกแแฆแแแ แขแแฅแกแขแฃแ แคแแ แแแจแ base64-แแก แแแแแงแแแแแแ:
base64 9B695056.gpg.gpg > 9B695056.txt
. แแแแขแแแขแ แแแแแแแกแแแแ แชแแแแแจแ: GPG_KEY_CONTENTS.
แจแแฅแแแแแ แแแงแแแแแ แแแแแก แแแญแแ แแกแ แแ PR-แแก แจแแฅแแแแกแแก
แแแ แแแ แ แแแจแ, แแฅแแแ แฃแแแ แจแแฅแแแแ แกแแฅแแฆแแแแ แแฅแแแแ แแ แแแฅแขแแก แซแแ แจแ: .github/workflows
.
แแแกแจแ แแแแแจแแแ แคแแแแ, แแแแแแแแแ, gradle-ci-build.yml
แจแแแแแแ แจแแแแแ แกแแ:
name: build
on:
push:
branches:
- master
- dev
- testing
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: Build with Gradle
uses: eskatos/gradle-command-action@v1
with:
gradle-version: current
arguments: build -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}
แแก แกแแแฃแจแแ แแ แแชแแกแ แแแแฎแแ แชแแแแแแแ แคแแแแแแแแแ แแแแแกแแแแกแแก master
, dev
ะธ testing
, แแกแแแ แแแแแแแแก แแแแฎแแแแแแแก แจแแฅแแแแกแแก.
แกแแแฃแจแแแแแแก แแแแงแแคแแแแแ แแแแกแแแฆแแ แแแก แแแแแฏแแแก, แ แแแแแแแช แฃแแแ แจแแกแ แฃแแแแก แแแแแแแแฃแ แแแแแแแแแแ. แแ แจแแแแฎแแแแแจแ, แฉแแแ แแแแจแแแแแ ubuntu-แก แฃแแฎแแแก แแแ แกแแแก, แแแแแแแงแแแแแ Java 8-แก แแ แแกแแแ แแแแแแแงแแแแแ แแแแแแแขแก Gradle-แแกแแแแก. eskatos/gradle-command-action@v1
แ แแแแแแช, แแจแแแแแแแก แฃแแฎแแแกแ แแแ แกแแแก แแแแแงแแแแแแ, แแแฃแจแแแแก แแแแแแแแฃแ แแ แซแแแแแแแก arguments
. แชแแแแแแแ secrets.SONATYPE_USERNAME
ะธ secrets.SONATYPE_PASSWORD
แแก แแ แแก แกแแแแฃแแแแแแแแ, แ แแแแแแแช แแแ แ แแแแแแฎแแ.
แแจแแแแแแแแแก แจแแแแแแแ แแแกแแฎแแแ แแแฅแแแแแแแแแก แฉแแแแ แแจแ:
แแแขแแแแขแฃแ แ แแแแแแแแแ แแฎแแแ แแแแแจแแแแแก แแแแแจแแแแแกแแก
แแแแแ แจแแแฅแแแแ แชแแแแ แกแแแฃแจแแ แแ แแชแแกแแก แคแแแแ แแแขแแแแขแฃแ แ แแแแแแแแแแกแแแแก gradle-ci-publish.yml
:
name: publish
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: Prepare to publish
run: |
echo '${{secrets.GPG_KEY_CONTENTS}}' | base64 -d > publish_key.gpg
gpg --quiet --batch --yes --decrypt --passphrase="${{secrets.SECRET_PASSPHRASE}}"
--output secret.gpg publish_key.gpg
echo "::set-env name=RELEASE_VERSION::${GITHUB_REF:11}"
- name: Publish with Gradle
uses: eskatos/gradle-command-action@v1
with:
gradle-version: current
arguments: test publish -Psigning.secretKeyRingFile=secret.gpg -Psigning.keyId=${{secrets.SIGNING_KEYID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}
แคแแแแ แแแแฅแแแก แแแแแขแฃแ แแ แฌแแแแก, แแแ แแ แแ แแแแแแแแกแ, แ แแแแแจแแช แแก แแแแฅแขแแฃแ แแแแ. แแ แจแแแแฎแแแแแจแ, แแก แแ แแก v-แแ แแแฌแงแแแฃแแ แขแแแแก แจแแฅแแแแก แแแแแแแ.
แแแแแแแกแแแแแแ, แฉแแแ แฃแแแ แแแแแแฆแแ PGP แแแกแแฆแแแ แกแแแแฃแแแแแแแแแ แแ แแแแแแแแกแแ แแ แแแฅแขแแก แซแแ แจแ, แแกแแแ แแแกแ แแแจแแคแแ แ. แจแแแแแแ, แฉแแแ แฃแแแ แแแแแงแแแแ แกแแแชแแแแฃแ แ แแแ แแแแก แชแแแแแ RELEASE_VERSION
แ แแแแแกแแช แฉแแแ แแแแแแ แแแแ gradle.build
แคแแแแ. แแก แงแแแแแคแแ แ แแแแแแแ แแแแงแแคแแแแแแจแ Prepare to publish
. แฉแแแ แแแฆแแแ แฉแแแแก แแแกแแฆแแแก GPG_KEY_CONTENTS แชแแแแแแแแ, แแแแ แแแแแ แแแก gpg แคแแแแแ แแ แจแแแแแ แแแจแแคแ แแแ แแแก แคแแแแจแ แฉแแกแแแ. secret.gpg
.
แจแแแแแแ, แฉแแแ แแแแแแ แแแแ แกแแแชแแแแฃแ แชแแแแแก GITHUB_REF
, แกแแแแแแแช แจแแแแแซแแแ แแแแแฆแแ แแแ แกแแ, แ แแแแแแช แแแแแงแแแแ แขแแแแก แจแแฅแแแแกแแก. แแก แชแแแแแ แแฅแขแฃแแแฃแ แแ แแ แจแแแแฎแแแแแจแ. refs/tags/v0.0.2
แกแแแแแแแช แฉแแแ แแฌแงแแแขแ แแแ แแแ 11 แกแแแแแแแก แแแแแ แแขแฃแแ แแแ แกแแแก แแแกแแฆแแแแ. แจแแแแแแ, แฉแแแ แแแงแแแแแ แกแขแแแแแ แขแฃแแ Gradle แแ แซแแแแแแแก แแแแแฅแแแงแแแแแกแแแแก: test publish
แแแแแแแแแแก แจแแแแแแแแก แจแแแแฌแแแแ Sonatype แกแแชแแแจแ
แแแแแจแแแแแก แจแแฅแแแแก แจแแแแแ, แฌแแแ แแแฌแแแจแ แแฆแฌแแ แแแ แกแแแฃแจแแ แแ แแชแแกแ แฃแแแ แแแแฌแงแแก. แแแแกแแแแแก แจแแฅแแแแแ แแแแแชแแแ:
แขแแแแก แกแแฎแแแ แฃแแแ แแแแฌแงแแก v-แแ. แแฃ แแแแแฅแแแงแแแแแก แแแแแฅแแแงแแแแแก แแแฌแแแแฃแแแแแก แจแแแแแ แกแแแฃแจแแ แแ แแชแแกแ แฌแแ แแแขแแแแ แแแกแ แฃแแแ, แฉแแแ แจแแแแแซแแแ แแแแแแแแแ
แแ แขแแคแแฅแขแ แแแแแฉแแแ Staging แกแแชแแแจแ. แแก แแแจแแแแ แแแแแฉแแแแแ แฆแแ แกแขแแขแฃแกแจแ, แจแแแแแ แฎแแแแ แฃแแแ แแแแแแแแแก Close แกแขแแขแฃแกแแ แจแแกแแแแแแกแ แฆแแแแแแก แแแญแแ แแ. แงแแแแ แแแแฎแแแแแก แแแแแแงแแคแแแแแแก แจแแแแฌแแแแแก แจแแแแแ, แแ แขแแคแแฅแขแ แแแแแแแก แแแฎแฃแ แแแก แกแขแแขแฃแกแจแ แแ แแฆแแ แแ แแก แฎแแแแแกแแฌแแแแแ แชแแแแแแแแแแกแแแแก. แแ แคแแ แแแ, แแก แแแกแ แฃแแแแแ MavenCentral-แจแ. แแฃ แงแแแแแคแแ แ แแแ แแแแแ, แจแแแแซแแแแ แแแแญแแ แแ แฆแแแแแก แ แแแแแแแ แแ แขแแคแแฅแขแ แแฆแแแฉแแแแแ Sonatype-แแก แกแแชแแแจแ.
แแแแกแแแแแก, แ แแ แแ แขแแคแแฅแขแ แแแฎแแแแก MavenCentral-แจแ, แแฅแแแ แฃแแแ แแแแแฎแแแแ แแก แแ แแแแชแแแแจแ, แ แแแแแแช แฉแแแ แแแแแแแแแ แจแแแฅแแแแแ. แแแแก แแแแแแแแ แแฎแแแแ แแ แแฎแแ แแญแแ แแแแแ, แแแแขแแ แฉแแแ แแแ แแแแแ แแแฅแแแงแแแแ. แจแแแแแแแจแ แแก แแ แแ แแก แกแแญแแ แ, แงแแแแแคแแ แ แแแขแแแแขแฃแ แแ แกแแแฅแ แแแแแแแแ. แแแ แกแฌแ แแคแแ แฉแแ แแแก แกแแแฅแ แแแแแแชแแ, แแแแ แแ แแแแฎแแแแแแ 5 แแฆแ แแแกแญแแ แแ แแแแกแแแแก, แ แแ แแ แขแแคแแฅแขแ แฎแแแแแกแแฌแแแแแ แงแแคแแแแงแ MavenCentral-แจแ.
แกแฃแ แแก แแ แแก, แฉแแแ แแแแแแแฅแแแงแแแ แฉแแแแ แแ แขแแคแแฅแขแ MavenCentral-แจแ.
แกแแกแแ แแแแแ แแแฃแแแแ
- แฒแกแแแแกแ
แกแขแแขแแแก , แแแแแฅแแแงแแแแ แแฎแแแแ maven-แแก แแแจแแแแแแ - แฒแแแแแ
แกแแชแแแ แกแแแแขแแแ Jira แกแแแแขแแแ, แ แแแแแจแแช แฃแแแ แจแแแฅแแแแก แแแแแแแแแแแแแแแแ แกแแชแแแ, แกแแแแช แงแแแแแคแแ แ แแแงแแแแแฃแแแ
แฌแงแแ แ: www.habr.com