如何在Gradle项目中设置maven artifact ID?

116

根据gradle的maven-publish插件文档,可以清楚地看到在build.gradle文件中直接设置项目的groupIdversion

group = 'org.gradle.sample'
version = '1.0'

然而,artifactId 似乎来自您正在工作的文件夹名称。有没有一种方式可以明确设置 artifactId

9个回答

118

来自36.2.3. 在生成的POM中的身份值

publishing {
    publications {
        maven(MavenPublication) {
            groupId 'org.gradle.sample'
            artifactId 'project1-sample'
            version '1.1'

            from components.java
        }
    }
}

Artifact ID默认为settings.gradle中配置的项目名称,而该文件默认使用项目目录的名称。

您需要相应的插件。

plugins {
    id 'maven-publish'
}

1
嗨Peter,感谢您的回复。看着我链接的文档,它也是65.4,我们显然有不同版本的文档。 - Armand
哈哈,我本来想这么做的,但我很想正确设置项目名称,而不是覆盖MavenPublication的名称,但我在这方面遇到了一些困难。 - Armand
16
如果您想更改项目名称(这是一个有点不同的问题),您可以在 settings.gradle 中进行更改(例如,rootProject.name =“something”)。 - Peter Niederwieser
请确保您拥有plugin: 'maven-publish',否则您将会得到Could not find method publishing()的错误提示。 - best wishes
2
重要提示:在settings.gradle中设置项目名称(例如rootProject.name =“org.myorg.myproject”)对于解决Jenkins构建上传到基于groupId的默认值,以Jenkins工作区文件夹名称为基础的问题至关重要。 - Farrukh Najmi
显示剩余2条评论

22

与根目录下的 settings.gradle 文件相关,您可以使用以下命令更改根项目的名称:

rootProject.name = "新名称"


rootProject.name = 'myproject'

但是如果您想要更改子项目的名称(例如,AndroidStudio项目的默认“app”子项目),则可以在根settings.gradle文件中执行以下操作:

但如果你想要改变一个子项目的名字(比如说,Android Studio 项目的默认 "app" 子项目),你可以在根 settings.gradle 文件里做类似这样的事情:

rootProject.children.each {
    it.name = ('app' == it.name ? 'MyAppName' : it.name)
}

正如@FarrukhNajmi在评论中提到的那样,在settings.gradle文件中添加rootProject.name可以防止在使用Jenkins构建时artifactID成为Jenkins作业名称。 - Fodder

9
这是“maven-publish”插件的正确答案,旨在取代较旧的“maven”插件。
如果您像我一样被困在旧插件中,正确回答“如何为Gradle项目设置Maven构件ID”的问题是:
uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = 'project-sample'
        }
    }
}

3
这是一个不好的想法。在这里这样做意味着任何依赖项,如果从其他地方相对于项目中声明,当生成POM文件时,将不能获得正确的artifactId。 - kebernet
我不记得这是真的(已经过去18个月了,自从我处理这个问题),但如果是这样,正确的答案是将您的Maven插件升级到具有更好模型的新版本。谢谢! - Matthew Mark Miller

8
如果您有一个多模块项目,并且想要构件的名称与目录不同(目录在settings.gradle中设置),那么我认为更好的方法是为每个子项目编写一个jar块,在其中编写baseName,它将是构件ID。然后,而不是为每个子项目重新编写publishing/publications块,您可以在主build.gradle中仅编写一次,如下所示:
对于每个子项目build.gradle:
jar {
    baseName = 'new-artifact-name-A'  //A beacause you also have B, C modules... 
}

在主 build.gradle 文件中:
publishing {
    publications {
        mavenJava(MavenPublication) {
           artifactId jar.baseName
           from components.java
        }
    }
}

找不到用于参数的jar()方法。 - Winter

3

若要使用Jenkins构建Android应用并发布到Artifactory,请在应用模块的build.gradle文件中配置以下设置以配置组ID、Artifact ID和版本。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    group "com.company.division.productgroup" //add group id
    version "8.8.8" //add version

    defaultConfig {

        minSdkVersion 9
        targetSdkVersion 21
        versionCode 32
        versionName "$version"
        archivesBaseName = "android-appname" //add artifact id

    }

archivesBaseName 没有效果。 - act262
在更近的Gradle/Android版本中,我发现BasePluginConvention提供了一个setArchivesBaseName()方法,可以代替直接赋值,并且在Android Gradle插件3.1.4和Gradle 4.10.2上对我有效。https://docs.gradle.org/current/javadoc/org/gradle/api/plugins/BasePluginConvention.html - John Michelau

2
在Gradle中,您可以设置jar.archiveName来覆盖使用工作文件夹名称的方法...
group = 'com.example'
version = '0.0.1-SNAPSHOT'
jar.archiveName = "myproject-0.0.1-SNAPSHOT.jar"

1
jar.archiveName和jar.baseName已经被弃用。 - antonpinchuk

2
然而,artifactId似乎是从您正在工作的文件夹名称中获取的。有没有一种方法可以显式设置artifactId?
一个简单的答案是设置jar.baseName,这将覆盖目录名称。
// changes the name of the jar from the directory name
jar.baseName = 'some_arifact_name';

这对我来说似乎有效。


1

这是我为 我的 Android 库 所做的。解决方案在 Kotlin DSL (build.gradle.kts)中:

plugins {
    id("maven-publish")
    // ...
}

afterEvaluate {
    publishing {
        publications {
            create<MavenPublication>("Release") {
                // ...
                groupId = "ir.mahozad.android"
                artifactId = "pie-chart"
                version = project.version.toString()
                artifact(sourcesArtifact)
                artifact(javadocArtifact)
                // ...
            }
        }
    }
}

您可以在此处查看完整的构建脚本文件
请参考此处的类似答案

0

你也可以添加一个条件来更改你的artifactId。

publishing {
    publications {
        maven(MavenPublication) {

            //adding conditional
            artifactId = artifactId == 'original-name' ? 'my-specific-name' : artifactId

            from components.java
        }
    }
}

如果你有很多项目名称需要更改,你也可以添加一个开关。

publishing {
    publications {
        maven(MavenPublication) {

            //adding switch
            switch(artifactId) {
                case 'first-project-original-name':
                    artifactId = 'my-first-specific-name'
                    break
                case 'second-project-original-name':
                    artifactId = 'my-second-specific-name'
                    break
                default:
                    break
            }

            from components.java
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接