Как установить идентификатор артефакта maven для проекта Gradle?

88

Из документации плагина gradle maven-publish ясно, что вы устанавливаете groupIdи versionпроекта непосредственно в build.gradle:

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

Однако artifactIdпохоже, что это происходит из имени папки, в которой вы работаете. Есть ли способ установить artifactIdявно?

Арман
источник

Ответы:

86

Начиная с 36.2.3. Значения идентичности в сгенерированном POM

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

            from components.java
        }
    }
}

Идентификатор артефакта по умолчанию соответствует настроенному имени проекта settings.gradle, которое, в свою очередь, соответствует имени каталога проекта.

Вам понадобится соответствующий плагин.

plugins {
    id 'maven-publish'
}
Питер Нидервизер
источник
Привет, Питер, спасибо за ответ. Глядя на документацию, на которую я ссылался, которая тоже 65.4, очевидно, что у нас есть разные версии документа.
Armand
Ах, это в 65.2.3 документа 2.0. Мои навыки понимания явно плохие; Не знаю, как я это пропустил, когда искал на странице «артефакт» - извинения.
Armand
Это пример 65.4 из главы, на которую вы ссылаетесь.
Peter Niederwieser
13
Если вы хотите изменить название проекта (что является отдельным вопросом), вы можете сделать это в settings.gradle(например rootProject.name = "something").
Peter Niederwieser
2
Важно: установка имени проекта в settings.gradle (например, rootProject.name = "org.myorg.myproject") имела решающее значение для устранения проблем, когда сборка Jenkins загружалась на groupId, по умолчанию на имя папки рабочего пространства Jenkins.
Фаррух Наджми
16

В отношении корневого settings.gradleфайла вы можете изменить имя корневого проекта с помощью:

rootProject.name = 'myproject'

Но если вы хотите изменить имя подпроекта (например, подпроект «app» по умолчанию для проекта AndroidStudio), вы можете сделать что-то вроде этого, все еще в корневом settings.gradleфайле:

rootProject.children.each {
    it.name = ('app' == it.name ? 'MyAppName' : it.name)
}
Алекс Доммаш
источник
Как упомянул @FarrukhNajmi в комментарии, добавление rootProject.name в файл settings.gradle останавливает превращение artifactID в имя задания Jenkins при сборке с Jenkins.
Fodder
8

Это правильный ответ для плагина maven-publish . Он предназначен в качестве преемника более старого плагина maven .

Если, как и я, вы застряли со старым плагином, правильный ответ на вопрос «Как мне установить идентификатор артефакта maven для проекта Gradle»:

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = 'project-sample'
        }
    }
}
Мэттью Марк Миллер
источник
3
Это плохая идея. Выполнение этого здесь означает, что любые зависимости, которые вы объявили относительно проекта относительно других источников, не получат правильный artifactId, когда для них будет создан pom.
kebernet
Я не помню, чтобы это было правдой (прошло 18 месяцев с тех пор, как я занимался этим), но если так, правильный ответ - обновить плагин maven до нового с лучшей моделью. Спасибо!
Мэтью Марк Миллер,
6

Если у вас есть многомодульный проект и вы хотите, чтобы имена артефактов отличались от каталога (который задается в settings.gradle), то я думаю, что лучший подход - иметь блок jar для каждого подпроекта, и там вы можете написать baseName, которое будет идентификатором артефакта. Затем вместо того, чтобы переписывать блок публикации / публикаций для каждого подпроекта, вы пишете его только один раз в основном 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
        }
    }
}
OhadR
источник
Не удалось найти метод jar () для аргументов
Зима
2

Для сборки Android и публикации в artifactory с помощью jenkins я настроил параметры ниже в модулях приложения файле build.gradle приложения для настройки идентификатора группы, идентификатора артефакта и версии.

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
источник
archivesBaseName нет эффекта
act262
В более поздних версиях Gradle / Android я обнаружил, что существует метод setArchivesBaseName (), предоставляемый BasePluginConvention, который доступен вместо прямого назначения, и он работает для меня в плагинах Android Gradle 3.1.4 и Gradle 4.10.2 . docs.gradle.org/current/javadoc/org/gradle/api/plugins/…
Джон
2

Однако похоже, что artifactId взят из имени папки, в которой вы работаете. Есть ли способ явно установить artifactId?

Простой ответ - установить, jar.baseNameкоторый затем переопределяет имя каталога.

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

Мне кажется, это работает.

Серый
источник
1

В Gradle вы можете настроить jar.archiveNameпереопределение использования имени рабочей папки ...

group = 'com.example'
version = '0.0.1-SNAPSHOT'
jar.archiveName = "myproject-0.0.1-SNAPSHOT.jar"
Брент Брэдберн
источник