Jak ustawić identyfikator artefaktu Mavena projektu Gradle?

85

Z dokumentacji wtyczki gradle maven-publikuj jasno wynika, że ​​ustawiasz groupIdand versionprojektu bezpośrednio w build.gradle:

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

artifactIdWygląda jednak na to, że pochodzi z nazwy folderu, w którym pracujesz. Czy istnieje sposób, aby ustawić to artifactIdjawnie?

Armand
źródło

Odpowiedzi:

85

Od 36.2.3. Wartości tożsamości w wygenerowanym POM

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

            from components.java
        }
    }
}

Identyfikator artefaktu domyślnie odpowiada nazwie projektu skonfigurowanej w programie settings.gradle, która z kolei domyślnie jest nazwą katalogu projektu.

Będziesz potrzebować odpowiedniej wtyczki.

plugins {
    id 'maven-publish'
}
Peter Niederwieser
źródło
Cześć Peter, dzięki za odpowiedź. Patrząc na dokumentację, do której linkowałem, która również ma numer 65.4, oczywiście mamy różne wersje tego dokumentu.
Armand,
Ach, jest w 65.2.3 dokumentu 2.0. Moje umiejętności rozumienia są oczywiście słabe; Nie wiem, jak to przegapiłem, szukając na stronie „artefaktu” - przepraszam.
Armand
To przykład 65.4 w rozdziale, do którego prowadziło łącze.
Peter Niederwieser
13
Jeśli chcesz zmienić nazwę projektu (co jest rodzajem osobnego pytania), możesz to zrobić w settings.gradle(np rootProject.name = "something".).
Peter Niederwieser
2
Ważne: Ustawienie nazwy projektu w settings.gradle (np. RootProject.name = "org.myorg.myproject") było krytyczne dla naprawienia problemów związanych z przesyłaniem kompilacji Jenkins do opartego na groupId domyślnej nazwy folderu obszaru roboczego Jenkins.
Farrukh Najmi
16

W odniesieniu do settings.gradlepliku głównego możesz zmienić nazwę projektu głównego za pomocą:

rootProject.name = 'myproject'

Ale jeśli chcesz zmienić nazwę projektu podrzędnego (na przykład domyślnego projektu podrzędnego „app” w projekcie AndroidStudio), możesz zrobić coś takiego, nadal w settings.gradlepliku głównym :

rootProject.children.each {
    it.name = ('app' == it.name ? 'MyAppName' : it.name)
}
Alex Dommasch
źródło
Jak wspomniał @FarrukhNajmi w komentarzu, dodanie rootProject.name w pliku settings.gradle powoduje, że artefactID nie staje się nazwą zadania Jenkinsa podczas budowania z Jenkins.
Pasza
8

To jest poprawna odpowiedź dla wtyczki maven-opublikuj . Ma to być następca starszej wtyczki maven .

Jeśli tak jak ja utkniesz ze starszą wtyczką, poprawna odpowiedź na pytanie „Jak ustawić identyfikator artefaktu mavena dla projektu Gradle” to:

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = 'project-sample'
        }
    }
}
Matthew Mark Miller
źródło
3
To jest zły pomysł. Zrobienie tego w tym miejscu oznacza, że ​​wszelkie zależności, które zadeklarowałeś względem projektu względnie z innego miejsca, nie otrzymają prawidłowego artefactId, gdy zostanie dla nich wygenerowany pom.
kebernet
Nie przypominam sobie, żeby to było prawdą (minęło 18 miesięcy, odkąd się tym zajmowałem), ale jeśli tak, poprawną odpowiedzią jest uaktualnienie wtyczki maven do nowej z lepszym modelem. Dziękuję Ci!
Matthew Mark Miller
6

Jeśli masz projekt wielomodułowy i chcesz, aby nazwy artefaktów różniły się od katalogu (który jest ustawiony w pliku settings.gradle), myślę, że lepszym podejściem jest posiadanie bloku słoika dla każdego podprojektu, i tam możesz napisać baseName, który będzie identyfikatorem artefaktu. Następnie, zamiast ponownie pisać blok publikacji / publikacji dla każdego podprojektu, piszesz go tylko raz w głównej kompilacji.gradle w ten sposób:

dla każdego projektu podrzędnego build.gradle:

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

w głównym pliku build.gradle:

publishing {
    publications {
        mavenJava(MavenPublication) {
           artifactId jar.baseName
           from components.java
        }
    }
}
OhadR
źródło
Nie można znaleźć metody jar () dla argumentów
zima
2

W przypadku kompilowania systemu Android i publikowania w Artifactory przy użyciu Jenkinsa skonfigurowałem poniższe ustawienia w pliku build.gradle modułów aplikacji do konfigurowania identyfikatora grupy, identyfikatora artefaktu i wersji.

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

    }
ChinLoong
źródło
archivesBaseName bez efektu
act262
W nowszych wersjach Gradle / Android stwierdzam, że istnieje metoda setArchivesBaseName () udostępniana przez BasePluginConvention, która jest dostępna zamiast bezpośredniego przypisania i działa w przypadku wtyczki Android Gradle 3.1.4 i Gradle 4.10.2 . docs.gradle.org/current/javadoc/org/gradle/api/plugins/…
John Michelau
2

Jednak wydaje się, że artifactId pochodzi z nazwy folderu, w którym pracujesz. Czy istnieje sposób, aby jawnie ustawić artifactId?

Prostą odpowiedzią na to jest ustawienie tego, jar.baseNamektóry następnie zastępuje nazwę katalogu.

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

To wydaje się działać dla mnie.

Szary
źródło
1

W Gradle możesz ustawić, jar.archiveNameaby nadpisać użycie nazwy folderu roboczego ...

group = 'com.example'
version = '0.0.1-SNAPSHOT'
jar.archiveName = "myproject-0.0.1-SNAPSHOT.jar"
Brent Bradburn
źródło