Как установить идентификатор артефакта 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
        }
    }
}

Не удалось найти метод 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

    }

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.