Como você define o ID do artefato maven de um projeto do Gradle?


88

A partir da documentação do plug-in gradle maven-publish , está claro que você definiu o groupIde versiondo projeto diretamente em build.gradle:

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

No entanto, o artifactIdparece ser retirado do nome da pasta na qual você está trabalhando. Existe uma maneira de definir o artifactIdexplicitamente?

Respostas:


86

De 36.2.3. Valores de identidade no POM gerado

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

            from components.java
        }
    }
}

O ID do artefato é padronizado para o nome do projeto configurado no settings.gradle, que por sua vez é padronizado para o nome do diretório do projeto.

Você precisará do plugin apropriado.

plugins {
    id 'maven-publish'
}

Oi Peter, obrigado pela resposta. Olhando para a documentação que vinculei, que também é 65.4, obviamente temos diferentes versões do documento.
Armand

Ah, está em 65.2.3 do documento 2.0. Minhas habilidades de compreensão são obviamente fracas; Não sei como perdi isso ao pesquisar na página por 'artefato' - desculpas.
Armand

É o exemplo 65.4 no capítulo ao qual você vinculou.
Peter Niederwieser

13
Se você quiser mudar o nome do projeto (que é uma questão separada), você pode fazer isso em settings.gradle(por exemplo rootProject.name = "something").
Peter Niederwieser

2
Importante: Definir o nome do projeto em settings.gradle (por exemplo, rootProject.name = "org.myorg.myproject") foi crítico para corrigir problemas em que a compilação do Jenkins era carregada para um groupId baseado em padronização para o nome da pasta do espaço de trabalho do Jenkins.
Farrukh Najmi

16

Relacionado ao settings.gradlearquivo raiz , você pode alterar o nome do projeto raiz com:

rootProject.name = 'myproject'

Mas se quiser mudar o nome de um subprojeto (por exemplo, o subprojeto "app" padrão de um projeto AndroidStudio), você pode fazer algo assim, ainda no settings.gradlearquivo raiz :

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

Conforme mencionado por @FarrukhNajmi em um comentário, adicionar rootProject.name no arquivo settings.gradle impede que o artifactID se torne o nome do trabalho do Jenkins ao construir com o Jenkins.
Fodder

8

Esta é a resposta correta para o plugin maven-publish . Este é o sucessor do plugin maven mais antigo .

Se, como eu estou, você está preso ao plug-in mais antigo, a resposta correta para "Como faço para definir o ID do artefato maven para um projeto do Gradle" é:

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

3
Esta é uma má ideia. Fazer isso aqui significa que quaisquer dependências que você declarou contra o projeto relativamente de outro lugar não obterão o artifactId correto quando um pom for gerado para elas.
kebernet

Não me lembro de ser verdade (já se passaram 18 meses desde que lidei com isso), mas se for, a resposta correta é atualizar seu plug-in maven para o novo com o melhor modelo. Obrigado!
Matthew Mark Miller

6

Se você tem um projeto multimódulo e deseja que os nomes dos artefatos sejam diferentes do diretório (que é definido em settings.gradle), então acho que a melhor abordagem é ter um bloco jar para cada subprojeto, e aí você pode escrever o baseName, que será o id do artefato. Então, em vez de reescrever o bloco de publicação / publicações para cada subprojeto, você o escreve apenas uma vez no build.gradle principal desta forma:

para cada subprojeto build.gradle:

jar {
    baseName = 'new-artifact-name-A'  //A beacause you also have B, C modules... 
}

no build.gradle principal:

publishing {
    publications {
        mavenJava(MavenPublication) {
           artifactId jar.baseName
           from components.java
        }
    }
}

Não foi possível encontrar o método jar () para argumentos
Inverno,

2

Para construir o Android e publicar no artifactory usando jenkins, configurei as configurações abaixo no build.gradle dos módulos do aplicativo para configurar o id do grupo, id do artefato e versão.

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 sem efeito
act262

Em versões mais recentes do Gradle / Android, estou descobrindo que existe um método setArchivesBaseName () fornecido por BasePluginConvention que está disponível no lugar da atribuição direta e funciona para mim no plug-in Android Gradle 3.1.4 e Gradle 4.10.2 . docs.gradle.org/current/javadoc/org/gradle/api/plugins/…
John Michelau

2

No entanto, o artifactId parece ser obtido do nome da pasta na qual você está trabalhando. Existe uma maneira de definir o artifactId explicitamente?

Uma resposta simples para isso é definir o jar.baseNameque substitui o nome do diretório.

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

Isso parece funcionar para mim.


1

No Gradle , você pode definir jar.archiveNamepara substituir o uso do nome da pasta de trabalho ...

group = 'com.example'
version = '0.0.1-SNAPSHOT'
jar.archiveName = "myproject-0.0.1-SNAPSHOT.jar"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.