Як встановити ідентифікатор артефакту maven проекту gradle?


85

З документації плагіна gradle maven- публіка видно, що ви groupIdі versionпроект встановили безпосередньо в build.gradle:

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

Однак, artifactIdсхоже, це взято з назви папки, в якій ви працюєте. Чи є спосіб встановити artifactIdявний?

Відповіді:


85

З 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, ми, очевидно, маємо різні версії документа.
Арманд

Ах, це в 65.2.3 документації 2.0. Мої навички розуміння, очевидно, погані; Не знаю, як я це пропустив, шукаючи на сторінці "артефакт" - вибачення.
Арманд

Це приклад 65.4 у розділі, до якого ви зв’язали.
Peter Niederwieser

13
Якщо ви хочете змінити назву проекту (що є окремим запитанням), ви можете зробити це в settings.gradle(наприклад rootProject.name = "something").
Петер Нідервізер

2
Важливо: Встановлення імені проекту в settings.gradle (наприклад, rootProject.name = "org.myorg.myproject") було критично важливим для виправлення проблем, коли збірка Jenkins завантажувалась за замовчуванням до імені папки робочої області Jenkins за замовчуванням.
Farrukh Najmi

16

Що стосується кореневого settings.gradleфайлу, ви можете змінити назву кореневого проекту за допомогою:

rootProject.name = 'myproject'

Але якщо ви хочете змінити назву підпроекту (наприклад, підпроект "додаток" за замовчуванням проекту AndroidStudio), ви можете зробити щось подібне, все ще у кореневому settings.gradleфайлі:

rootProject.children.each {
    it.name = ('app' == it.name ? 'MyAppName' : it.name)
}

Як згадував @FarrukhNajmi в коментарі, додавання rootProject.name у файл settings.gradle зупиняє артефакт-ідентифікацію як ім'я завдання Дженкінса під час створення з Jenkins.
Корм

8

Це правильна відповідь для плагіна maven- publishing. Він призначений наступником старого плагіна maven .

Якщо, як і я, ви застрягли у старішому плагіні, правильна відповідь на питання "Як встановити ідентифікатор артефакту maven для проекту gradle":

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = 'project-sample'
        }
    }
}

3
Це погана ідея. Якщо ви зробите це тут, це означає, що будь-які залежності, які ви оголосили щодо проекту відносно з інших місць, не отримають правильного артефакту, коли для них буде створено пом.
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 та публікації в артефакторії за допомогою 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 ніякого ефекту
акт262

У більш пізніх версіях Gradle / Android я виявляю, що існує метод setArchivesBaseName (), наданий BasePluginConvention, який доступний замість прямого призначення, і він працює для мене на плагіні Android Gradle 3.1.4 та Gradle 4.10.2 . docs.gradle.org/current/javadoc/org/gradle/api/plugins/…
Джон

2

Однак артефактId, здається, взятий з імені папки, в якій ви працюєте. Чи є спосіб встановити артефактId явно?

Проста відповідь на це - встановити значення, 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.