将一个简单的 Java 库发布到 Maven
Publishing a simple Java library to Maven
我可能遗漏了一些重要的东西。但是,我正在努力将一个简单的库发布到 maven 存储库(它将被组织中其他基于 maven 的项目使用)
我找到的最好的指南在官方 Gradle 网站上:https://docs.gradle.org/current/userguide/publishing_maven.html
但是,还有很多未解决的问题:
除了手动包含 if-else 语句之外,是否没有办法区分 SNAPSHOT 和发布版本?
什么是from components.java
? IDEA 没有提供大多数这些 DSL 的自动完成或文档(与 Maven 不同,Maven 的代码智能运行良好)
如何发布到需要身份验证的私有存储库?我知道某处必须有一个使用的块:
username = "${artifactory_user}"
password = "${artifactory_password}"
从 ~/.gradle/gradle.properties
读取值
但是我应该把这个方块放在哪里呢?
总的来说,我觉得我在这里遗漏了一些东西,也许是一些被广泛阅读的文档......使用 maven 本身这个过程相当简单,官方文档使这个过程相对轻松
使用 Gradle,我觉得最简单的发布到存储库需要很多感觉就像自定义逻辑,当我的直觉说一些如此常见的东西必须已经封装在具有合理默认值的插件中时
在这里回答我自己的问题是发布到私人仓库的最低限度:
buildscript {
ext.kotlin_version = '1.3.41'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
plugins {
id 'java-library'
id 'maven-publish'
}
apply plugin: 'kotlin'
group 'com.company'
version '1.0.0-SNAPSHOT'
wrapper {
gradleVersion = '4.9'
distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
repositories {
mavenCentral()
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = 'some-artifactId'
from components.java
artifact sourcesJar
pom {
name = 'Project Name'
}
}
}
repositories {
maven {
url = "https://company.jfrog.io/company/maven-local"
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
}
}
}
test {
useJUnitPlatform()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
compile "com.squareup.moshi:moshi-kotlin:1.8.0"
compile "com.squareup.moshi:moshi-adapters:1.8.0"
compile "com.squareup.okhttp3:okhttp:4.0.1"
testImplementation "io.kotlintest:kotlintest-runner-junit5:3.1.0"
}
我看到你已经找到了你的解决方案,但我的回答旨在为你的问题提供详细的答案。
Is there no way to differentiate between SNAPSHOT and release builds other than to manually include the if-else statement?
正确。 if-else
语句正是您区分快照和发布版本所需要的。 Gradle 本身不提供任何类型的版本控制功能。这是留给你处理或插件,如 Nebula Release.
What is from components.java
from
是来自 AbstractCopyTask
which the Jar
任务类型的方法调用,是 的子类
components
又是另一个方法调用。您实际上是在调用 Project
的 getComponents()
。
components.java
是 components.getByName("java")
的糖分。这是因为 Groovy. 的 dynamic/magic
IDEA gives no autocomplete or documentation on most of these DSLs (unlike Maven, where the code intelligence works well)
这是由于 dynamic/weak 输入了 Groovy。 build.gradle
文件是使用 Groovy 编写的。 IntelliJ 确实会尝试推断构建脚本的类型,但不能完全推断。幸运的是,您现在可以使用 Kotlin 编写构建脚本:
- https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/
- https://docs.gradle.org/current/userguide/kotlin_dsl.html
我强烈建议继续使用 Kotlin DSL。您将确切地知道所有内容的来源。
How do I publish to a private repository that requires authentication?
不幸的是,maven-publish
插件的文档仅用一句话提到了它。即便如此,它只是将您引导至 API 文档,这些文档并非总是有用,但您能够弄明白。
https://docs.gradle.org/current/userguide/publishing_maven.html
You can also configure any authentication details that are required to connect to the repository. See MavenArtifactRepository for more details.
最后:
(...) the values being read from ~/.gradle/gradle.properties
Gradle 将竭尽全力解决 属性。 gradle.properties
只是 Gradle 寻找房产的众多地点之一。您可以在顶部 here.
的 Properties 部分下查看更多详细信息
我想通过使用 Kotlin DSL 提供您的答案的完整示例作为结束。同样使用 buildscript { }
是应用插件的传统方法,如 here. You should use the newer/preferred plugins { }
block going forward. More info here.
所述
plugins {
`maven-publish`
id("org.jetbrains.kotlin.jvm") version "1.3.31"
}
group = "com.company"
version = "1.0.0-SNAPSHOT"
tasks.wrapper {
gradleVersion = "5.6.1"
distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}
val sourcesJar by tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(sourceSets.main.get().allSource)
}
repositories {
mavenCentral()
}
publishing {
publications {
register<MavenPublication>("mavenJava") {
artifactId = "some-artifactId"
from(components["java"])
artifact(sourcesJar.get())
pom {
name.set("Project Name")
}
}
}
repositories {
maven {
url = uri("https://company.jfrog.io/company/maven-local")
credentials {
username = property("artifactory_user") as String
password = property("artifactory_password") as String
}
}
}
}
val test by tasks.getting(Test::class) {
useJUnitPlatform()
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
// ...
}
我可能遗漏了一些重要的东西。但是,我正在努力将一个简单的库发布到 maven 存储库(它将被组织中其他基于 maven 的项目使用)
我找到的最好的指南在官方 Gradle 网站上:https://docs.gradle.org/current/userguide/publishing_maven.html
但是,还有很多未解决的问题:
除了手动包含 if-else 语句之外,是否没有办法区分 SNAPSHOT 和发布版本?
什么是
from components.java
? IDEA 没有提供大多数这些 DSL 的自动完成或文档(与 Maven 不同,Maven 的代码智能运行良好)如何发布到需要身份验证的私有存储库?我知道某处必须有一个使用的块:
username = "${artifactory_user}" password = "${artifactory_password}"
从 ~/.gradle/gradle.properties
但是我应该把这个方块放在哪里呢?
总的来说,我觉得我在这里遗漏了一些东西,也许是一些被广泛阅读的文档......使用 maven 本身这个过程相当简单,官方文档使这个过程相对轻松
使用 Gradle,我觉得最简单的发布到存储库需要很多感觉就像自定义逻辑,当我的直觉说一些如此常见的东西必须已经封装在具有合理默认值的插件中时
在这里回答我自己的问题是发布到私人仓库的最低限度:
buildscript {
ext.kotlin_version = '1.3.41'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
plugins {
id 'java-library'
id 'maven-publish'
}
apply plugin: 'kotlin'
group 'com.company'
version '1.0.0-SNAPSHOT'
wrapper {
gradleVersion = '4.9'
distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
repositories {
mavenCentral()
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = 'some-artifactId'
from components.java
artifact sourcesJar
pom {
name = 'Project Name'
}
}
}
repositories {
maven {
url = "https://company.jfrog.io/company/maven-local"
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
}
}
}
test {
useJUnitPlatform()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
compile "com.squareup.moshi:moshi-kotlin:1.8.0"
compile "com.squareup.moshi:moshi-adapters:1.8.0"
compile "com.squareup.okhttp3:okhttp:4.0.1"
testImplementation "io.kotlintest:kotlintest-runner-junit5:3.1.0"
}
我看到你已经找到了你的解决方案,但我的回答旨在为你的问题提供详细的答案。
Is there no way to differentiate between SNAPSHOT and release builds other than to manually include the if-else statement?
正确。 if-else
语句正是您区分快照和发布版本所需要的。 Gradle 本身不提供任何类型的版本控制功能。这是留给你处理或插件,如 Nebula Release.
What is
from components.java
from
是来自AbstractCopyTask
which theJar
任务类型的方法调用,是 的子类
components
又是另一个方法调用。您实际上是在调用Project
的getComponents()
。components.java
是components.getByName("java")
的糖分。这是因为 Groovy. 的 dynamic/magic
IDEA gives no autocomplete or documentation on most of these DSLs (unlike Maven, where the code intelligence works well)
这是由于 dynamic/weak 输入了 Groovy。 build.gradle
文件是使用 Groovy 编写的。 IntelliJ 确实会尝试推断构建脚本的类型,但不能完全推断。幸运的是,您现在可以使用 Kotlin 编写构建脚本:
- https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/
- https://docs.gradle.org/current/userguide/kotlin_dsl.html
我强烈建议继续使用 Kotlin DSL。您将确切地知道所有内容的来源。
How do I publish to a private repository that requires authentication?
不幸的是,maven-publish
插件的文档仅用一句话提到了它。即便如此,它只是将您引导至 API 文档,这些文档并非总是有用,但您能够弄明白。
https://docs.gradle.org/current/userguide/publishing_maven.html
You can also configure any authentication details that are required to connect to the repository. See MavenArtifactRepository for more details.
最后:
(...) the values being read from ~/.gradle/gradle.properties
Gradle 将竭尽全力解决 属性。 gradle.properties
只是 Gradle 寻找房产的众多地点之一。您可以在顶部 here.
我想通过使用 Kotlin DSL 提供您的答案的完整示例作为结束。同样使用 buildscript { }
是应用插件的传统方法,如 here. You should use the newer/preferred plugins { }
block going forward. More info here.
plugins {
`maven-publish`
id("org.jetbrains.kotlin.jvm") version "1.3.31"
}
group = "com.company"
version = "1.0.0-SNAPSHOT"
tasks.wrapper {
gradleVersion = "5.6.1"
distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}
val sourcesJar by tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(sourceSets.main.get().allSource)
}
repositories {
mavenCentral()
}
publishing {
publications {
register<MavenPublication>("mavenJava") {
artifactId = "some-artifactId"
from(components["java"])
artifact(sourcesJar.get())
pom {
name.set("Project Name")
}
}
}
repositories {
maven {
url = uri("https://company.jfrog.io/company/maven-local")
credentials {
username = property("artifactory_user") as String
password = property("artifactory_password") as String
}
}
}
}
val test by tasks.getting(Test::class) {
useJUnitPlatform()
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
// ...
}