Wie legen Sie die Maven-Artefakt-ID eines Gradle-Projekts fest?

84

Aus der Dokumentation des Gradle Maven-Publish-Plugins geht hervor, dass Sie das groupIdund versiondes Projekts direkt in build.gradle:

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

Das artifactIdscheint jedoch dem Namen des Ordners entnommen zu sein, in dem Sie arbeiten. Gibt es eine Möglichkeit, das artifactIdexplizit festzulegen?

Armand
quelle

Antworten:

83

Ab 36.2.3. Identitätswerte im generierten POM

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

            from components.java
        }
    }
}

Die Artefakt-ID verwendet standardmäßig den in konfigurierten Projektnamen settings.gradle, der standardmäßig den Namen des Projektverzeichnisses verwendet.

Sie benötigen das entsprechende Plugin.

plugins {
    id 'maven-publish'
}
Peter Niederwieser
quelle
Hallo Peter, danke für die Antwort. Wenn wir uns die Dokumentation ansehen, auf die ich verlinkt habe, die auch 65.4 ist, haben wir offensichtlich verschiedene Versionen des Dokuments.
Armand
Ah, es ist in 65.2.3 des 2.0-Dokuments. Meine Verständnisfähigkeiten sind offensichtlich schlecht; Ich weiß nicht, wie ich das verpasst habe, als ich die Seite nach "Artefakt" durchsucht habe - Entschuldigung.
Armand
Es ist Beispiel 65.4 in dem Kapitel, mit dem Sie verlinkt haben.
Peter Niederwieser
13
Wenn Sie den Projektnamen ändern möchten (was eine Art separate Frage ist), können Sie dies in settings.gradle(z rootProject.name = "something". B. ) tun .
Peter Niederwieser
2
Wichtig: Das Festlegen des Projektnamens in settings.gradle (z. B. rootProject.name = "org.myorg.myproject") war entscheidend für die Behebung von Problemen, bei denen der Jenkins-Build auf eine groupId-basierte Standardeinstellung mit dem Jenkins-Arbeitsbereich-Ordnernamen hochgeladen wurde.
Farrukh Najmi
15

In Bezug auf die Stammdatei settings.gradlekönnen Sie den Namen des Stammprojekts ändern mit:

rootProject.name = 'myproject'

Wenn Sie jedoch den Namen eines Unterprojekts ändern möchten (z. B. das Standard-Unterprojekt "App" eines AndroidStudio-Projekts), können Sie Folgendes in der Stammdatei tun settings.gradle:

rootProject.children.each {
    it.name = ('app' == it.name ? 'MyAppName' : it.name)
}
Alex Dommasch
quelle
Wie von @FarrukhNajmi in einem Kommentar erwähnt, verhindert das Hinzufügen des rootProject.name in der Datei settings.gradle, dass die Artefakt-ID beim Erstellen mit Jenkins zum Jenkins-Jobnamen wird.
Futter
7

Dies ist die richtige Antwort für das Maven-Publish- Plugin. Dies ist als Nachfolger für das ältere Maven- Plugin gedacht .

Wenn Sie wie ich mit dem älteren Plugin nicht weiterkommen, lautet die richtige Antwort auf "Wie setze ich die Maven-Artefakt-ID für ein Gradle-Projekt?"

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = 'project-sample'
        }
    }
}
Matthew Mark Miller
quelle
3
Das ist eine schlechte Idee. Wenn Sie dies hier tun, erhalten Abhängigkeiten, die Sie relativ von einem anderen Ort aus für das Projekt deklariert haben, nicht die richtige Artefakt-ID, wenn ein POM für sie generiert wird.
Kebernet
Ich erinnere mich nicht daran, dass dies wahr ist (es ist 18 Monate her, seit ich mich damit befasst habe), aber wenn ja, ist die richtige Antwort, Ihr Maven-Plugin auf das neue mit dem besseren Modell zu aktualisieren. Danke dir!
Matthew Mark Miller
6

Wenn Sie ein Projekt mit mehreren Modulen haben und möchten, dass sich die Namen der Artefakte vom Verzeichnis unterscheiden (das in settings.gradle festgelegt ist), ist es meiner Meinung nach besser, für jedes Unterprojekt einen JAR-Block zu haben. und dort können Sie den baseName schreiben, der die Artefakt-ID sein wird. Dann , anstatt neu zu schreiben die Veröffentlichung / Publikationen Block für jedes Teilprojekt, schreiben Sie es nur einmal im Haupt build.gradle auf diese Weise:

für jedes Teilprojekt build.gradle:

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

im Hauptgebäude.gradle:

publishing {
    publications {
        mavenJava(MavenPublication) {
           artifactId jar.baseName
           from components.java
        }
    }
}
OhadR
quelle
Methode jar () für Argumente konnte nicht gefunden werden
Winter
2

Für das Erstellen von Android und das Veröffentlichen in Artifactory mit Jenkins habe ich die folgenden Einstellungen im build.gradle der App-Module zum Konfigurieren der Gruppen-ID, der Artefakt-ID und der Version konfiguriert.

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
quelle
archivesBaseName keine Wirkung
act262
In neueren Versionen von Gradle / Android stelle ich fest, dass es eine von BasePluginConvention bereitgestellte setArchivesBaseName () -Methode gibt, die anstelle der direkten Zuweisung verfügbar ist und für mich unter Android Gradle Plugin 3.1.4 und Gradle 4.10.2 funktioniert . docs.gradle.org/current/javadoc/org/gradle/api/plugins/…
John Michelau
2

Die Artefakt-ID scheint jedoch dem Namen des Ordners entnommen zu sein, in dem Sie arbeiten. Gibt es eine Möglichkeit, die Artefakt-ID explizit festzulegen?

Eine einfache Antwort darauf besteht darin, jar.baseNamedas festzulegen, das dann den Verzeichnisnamen überschreibt.

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

Das scheint bei mir zu funktionieren.

Grau
quelle
1

In Gradle können Sie festlegen jar.archiveName, dass die Verwendung des Arbeitsordnernamens überschrieben wird ...

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