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?

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'
}

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)
}

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'
        }
    }
}

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
        }
    }
}

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

    }

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.


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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.