【问题标题】:How do you set the maven artifact ID of a gradle project?如何设置 gradle 项目的 maven 工件 ID?
【发布时间】:2014-09-09 18:04:06
【问题描述】:

从gradlemaven-publish plugin's documentation看,很明显你直接在build.gradle中设置了项目的groupIdversion

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

但是,artifactId 似乎取自您正在使用的文件夹的名称。有没有办法明确设置artifactId

【问题讨论】:

    标签: maven gradle


    【解决方案1】:

    来自36.2.3. Identity values in the generated POM

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

    工件 ID 默认为 settings.gradle 中配置的项目名称,而该名称又默认为项目目录的名称。

    您需要合适的插件。

    plugins {
        id 'maven-publish'
    }
    

    【讨论】:

    • 嗨,彼得,感谢您的回复。查看我链接到的文档,也是 65.4,我们显然有不同版本的文档。
    • 啊,它在 2.0 文档的 65.2.3 中。我的理解能力显然很差;我不知道在搜索“神器”页面时我是怎么错过的 - 抱歉。
    • 它是您链接到的章节中的 example 65.4。
    • 如果您想更改项目名称(这是一个单独的问题),您可以在settings.gradle(例如rootProject.name = "something")中进行。
    • 重要提示:在 settings.gradle 中设置项目名称(例如 rootProject.name = "org.myorg.myproject")对于解决 Jenkins 构建上传到基于 groupId 默认为 Jenkins 工作区的问题至关重要文件夹名称。
    【解决方案2】:

    与根settings.gradle文件相关,可以通过以下方式更改根项目的名称:

    rootProject.name = 'myproject'
    

    但是如果你想更改一个子项目的名称(例如,AndroidStudio 项目的默认“app”子项目),你可以这样做,仍然在根settings.gradle 文件中:

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

    【讨论】:

    • 正如@FarrukhNajmi 在评论中提到的那样,在 settings.gradle 文件中添加 rootProject.name 会阻止 artifactID 在使用 Jenkins 构建时成为 Jenkins 作业名称。
    【解决方案3】:

    这是 ma​​ven-publish 插件的正确答案。这是旧版 ma​​ven 插件的继任者。

    如果像我一样,您被旧插件卡住了,那么“如何为 gradle 项目设置 maven 工件 id”的正确答案是:

    uploadArchives {
        repositories {
            mavenDeployer {
                pom.artifactId = 'project-sample'
            }
        }
    }
    

    【讨论】:

    • 这是个坏主意。在此处执行此操作意味着您从其他地方相对于该项目声明的任何依赖项在为它们生成 pom 时都不会获得正确的 artifactId。
    • 我不记得这是真的(我处理这个问题已经 18 个月了)但如果是这样,正确的答案是将您的 maven 插件升级到具有更好模型的新插件。谢谢!
    【解决方案4】:

    如果您有一个多模块项目,并且您希望工件的名称不同于目录(在 settings.gradle 中设置),那么我认为更好的方法是为每个子设置一个 jar 块-project,在那里你可以写下baseName,这将是artifact-id。然后,而不是为每个子项目重写发布/发布块,你只在主 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()
    【解决方案5】:

    为了使用 jenkins 构建 android 并发布到工件,我在应用模块的 build.gradle 中配置了以下设置,用于配置组 ID、工件 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 无效
    • 在最新版本的 Gradle/Android 中,我发现 BasePluginConvention 提供了一个 setArchivesBaseName() 方法,可以代替直接分配,它适用于我的 Android Gradle 插件3.1.4 和 Gradle 4.10.2。 docs.gradle.org/current/javadoc/org/gradle/api/plugins/…
    【解决方案6】:

    但是,artifactId 似乎取自您正在工作的文件夹的名称。有没有办法明确设置 artifactId?

    对此的简单回答是设置jar.baseName,然后覆盖目录名称。

    // changes the name of the jar from the directory name
    jar.baseName = 'some_arifact_name';
    

    这似乎对我有用。

    【讨论】:

      【解决方案7】:

      Gradle 中,您可以设置 jar.archiveName 以覆盖使用工作文件夹的名称...

      group = 'com.example'
      version = '0.0.1-SNAPSHOT'
      jar.archiveName = "myproject-0.0.1-SNAPSHOT.jar"
      

      【讨论】:

      • jar.archiveName 以及 jar.baseName 已被弃用
      【解决方案8】:

      您也可以添加条件来更改您的 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
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-01
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        • 2011-06-01
        • 2019-01-03
        • 2017-05-26
        • 1970-01-01
        相关资源
        最近更新 更多