web-dev-qa-db-fra.com

Ajout manuel d'un fichier aar avec un fichier pom / iml de dépendance

Comme je ne peux pas utiliser un maven privé pour partager ma bibliothèque, je pensais à partager l'aar et à l'importer dans un autre projet. Le problème survient lorsque les fichiers aar et jar ne contiennent aucune dépendance. Donc, une fois que j'ai importé manuellement le fichier aar dans Android studio (en utilisant le package Import .JAR/.AA), il n'y a plus de dépendance, et je dois ajouter manuellement toutes les dépendances. J'ai déjà généré un fichier pom à travers une tâche gradle, bien que je ne trouve aucun moyen de l'importer manuellement sur le projet.

Sur le fichier build.gradle généré automatiquement par le "Importer le package .JAR/.AA" se trouve:

configurations.maybeCreate("default")
artifacts.add("default", file('TestSample_1.0.0.aar'))

Existe-t-il un moyen d'ajouter également le fichier pom/iml? quelque chose comme:

artifacts.add("default", file('pomDependencies.xml'))
25
iGoDa

1. Publication

Dans votre projet aar, ajoutez maven-publish plugin et ajouter la configuration de plugin nécessaire.

apply plugin: 'com.Android.library'
apply plugin: 'maven-publish'

...

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.1.1'
    compile 'com.novoda:bintray-release:0.2.7'
}

...

publishing {
    publications {
        maven(MavenPublication) {
            groupId 'com.example' //You can either define these here or get them from project conf elsewhere
            artifactId 'example'
            version '0.0.1-SNAPSHOT'
            artifact "$buildDir/outputs/aar/app-release.aar" //aar artifact you want to publish

            //generate pom nodes for dependencies
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }
        }
    }

    //publish to filesystem repo
    repositories{
        maven {
            url "$buildDir/repo"
        }
    }
}

Peu de choses à noter:

  1. Nous utilisons une publication maven personnalisée, vous devez donc définir ce qui est publié avec la clause artifact

  2. Nous devons générer le pom nous-mêmes, dans le code ci-dessus j'utilise toutes les dépendances de compilation, vous voudrez peut-être vous assurer que toutes les configurations qui vous intéressent sont couvertes.

Fonctionnement gradle publish sera publié dans une structure de référentiel maven dans le dossier repo, que vous pourrez ensuite utiliser à partir d'un autre projet.

2. Utilisation de .aar publié

Dans un autre projet Android, pour utiliser l'aar publié dans # 1: dans le build.gradle de niveau supérieur:

allprojects {
    repositories {
        jcenter()
        maven {
            url "D:/full/path/to/repo"
        }
    }
}

ajoutez le chemin d'accès au référentiel antérieur en tant que référentiel maven. Notez que vous devrez peut-être utiliser le chemin d'accès complet, car $buildDir a une valeur différente pour ce projet. Dans votre application build.gradle:

dependencies {
    ...
    other dependencies
    ...
    compile ('com.example:example:0.0.1-SNAPSHOT@aar'){transitive=true}
}

transitive=true est requis pour récupérer les dépendances transitives du fichier pom.

38
RaGe

Les choses ont un peu changé, voici comment procéder avec les dernières versions de gradle

Créer le paquet localement (aar et pom)

Modifiez votre fichier de bibliothèque build.gradle Pour l'inclure

apply plugin: 'maven-publish'

Android {
    ...
    ...
}

dependencies {
    ...
    ...
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId 'com.domain' //You can either define these here or get them from project conf elsewhere
            artifactId 'name'
            version '1.0.0'
            artifact "$buildDir/outputs/aar/sdk-release.aar" //aar artifact you want to publish

            //generate pom nodes for dependencies
            pom.withXml {
            def dependenciesNode = asNode().appendNode('dependencies')
            configurations.implementation.allDependencies.each { dependency ->
                if (dependency.name != 'unspecified') {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }
        }
    }

    //publish to filesystem repo
    repositories{
        maven {
            url "$buildDir/repo"
        }
    }
}

Exécuter à partir du terminal

./gradlew clean
./gradlew build
./gradlew --console=verbose publishToMavenLocal

Les fichiers aar et pom ont été créés dans $HOME/.m2/repository/

Comment charger la bibliothèque d'un autre projet

Modifiez le build.gradle Des projets de la manière suivante:

allprojects {
    repositories {
        maven {
            url "/Users/username/.m2/repository/"
        }
        google()
        jcenter()
    }

Vous pouvez utiliser $rootDir Et définir un chemin relatif.

Ajoutez la bibliothèque en tant que dépendance dans votre module d'application build.gradle

implementation 'com.domain:name:1.0.0'

0
aviran