studio modulos mejores librerias library create crear agregar android gradle android-gradle android-library maven-publish

modulos - import module android studio



Publica una biblioteca de Android en Maven con aar y código fuente. (5)

Aquí está mi solución mejorada, basada en otras respuestas.

Gist: https://gist.github.com/Robyer/a6578e60127418b380ca133a1291f017

Cambios de otras respuestas:

  • classifier modificado: debe ser "sources" ( no "source" )
  • Maneja dependencias

    • Soporta también @aar y transitive: false . En ese caso, establecemos la exclusión en POM para ignorar todas las dependencias transitivas de esta dependencia.
    • También admite reglas de exclusión personalizadas en dependencias, por ejemplo:

      compile(''com.example:something:1.0'', { exclude group: ''com.exclude.this'', module: ''some-module'' })

  • No es necesario especificar la ruta del artefacto manualmente.

Registro de cambios:

  • 27.3.2018 - Se agregó soporte para las dependencias de api / implementación en el nuevo Gradle

apply plugin: ''maven-publish'' task androidJavadocs(type: Javadoc) { source = android.sourceSets.main.java.srcDirs classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) android.libraryVariants.all { variant -> if (variant.name == ''release'') { owner.classpath += variant.javaCompile.classpath } } exclude ''**/R.html'', ''**/R.*.html'', ''**/index.html'' } task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { classifier = ''javadoc'' from androidJavadocs.destinationDir } task androidSourcesJar(type: Jar) { classifier = ''sources'' from android.sourceSets.main.java.srcDirs } publishing { publications { maven(MavenPublication) { //groupId ''cz.example'' //artifactId ''custom-artifact'' //version = android.defaultConfig.versionName artifact bundleRelease artifact androidJavadocsJar artifact androidSourcesJar pom.withXml { final dependenciesNode = asNode().appendNode(''dependencies'') ext.addDependency = { Dependency dep, String scope -> if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified") return // ignore invalid dependencies final dependencyNode = dependenciesNode.appendNode(''dependency'') dependencyNode.appendNode(''groupId'', dep.group) dependencyNode.appendNode(''artifactId'', dep.name) dependencyNode.appendNode(''version'', dep.version) dependencyNode.appendNode(''scope'', scope) if (!dep.transitive) { // If this dependency is transitive, we should force exclude all its dependencies them from the POM final exclusionNode = dependencyNode.appendNode(''exclusions'').appendNode(''exclusion'') exclusionNode.appendNode(''groupId'', ''*'') exclusionNode.appendNode(''artifactId'', ''*'') } else if (!dep.properties.excludeRules.empty) { // Otherwise add specified exclude rules final exclusionNode = dependencyNode.appendNode(''exclusions'').appendNode(''exclusion'') dep.properties.excludeRules.each { ExcludeRule rule -> exclusionNode.appendNode(''groupId'', rule.group ?: ''*'') exclusionNode.appendNode(''artifactId'', rule.module ?: ''*'') } } } // List all "compile" dependencies (for old Gradle) configurations.compile.getAllDependencies().each { dep -> addDependency(dep, "compile") } // List all "api" dependencies (for new Gradle) as "compile" dependencies configurations.api.getAllDependencies().each { dep -> addDependency(dep, "compile") } // List all "implementation" dependencies (for new Gradle) as "runtime" dependencies configurations.implementation.getAllDependencies().each { dep -> addDependency(dep, "runtime") } } } } }

¿Alguien me puede dar una pista sobre cómo usar el complemento gradle de maven-publish para publicar un proyecto / módulo com.android.library con aar y código fuente? Puedo hacer esto con el viejo plugin de maven, pero me gustaría usar el nuevo plugin de maven-publish.


Si desea evitar los códigos de repetición, porque el complemento maven-publish no escribe dependencias en pom.xml

Prueba este plugin: github.com/wupdigital/android-maven-publish

publishing { publications { mavenAar(MavenPublication) { from components.android } } }


También puede utilizar el complemento de Android Maven . Crea el .aar, javadoc.jar, sources.jar y .pom y actualiza el maven-metadata.xml después de cargar los archivos en el repositorio de Maven. También puse el guión en GitHub .

apply plugin: ''com.android.library'' apply plugin: ''maven'' //Your android configuration android { //... } //maven repository info group = ''com.example'' version = ''1.0.0'' ext { //Specify your maven repository url here repositoryUrl = ''ftp://your.maven.repository.com/maven2'' //Or you can use ''file:////C://Temp'' or ''maven-temp'' for a local maven repository } //Upload android library to maven with javadoc and android sources configurations { deployerJars } //If you want to deploy to an ftp server dependencies { deployerJars "org.apache.maven.wagon:wagon-ftp:2.2" } // custom tasks for creating source/javadoc jars task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) destinationDir = file("../javadoc/") failOnError false } task javadocJar(type: Jar, dependsOn: javadoc) { classifier = ''javadoc'' from javadoc.destinationDir } //Creating sources with comments task androidSourcesJar(type: Jar) { classifier = ''sources'' from android.sourceSets.main.java.srcDirs } //Put the androidSources and javadoc to the artifacts artifacts { archives androidSourcesJar archives javadocJar } uploadArchives { repositories { mavenDeployer { configuration = configurations.deployerJars repository(url: repositoryUrl) { //if your repository needs authentication authentication(userName: "username", password: "password") } } } }

Llamalo con

./gradlew uploadArchives


Un pequeño retoque a dskinners responde con la correcta generación de dependencias:

apply plugin: ''maven-publish'' task sourceJar(type: Jar) { from android.sourceSets.main.java.srcDirs classifier "source" } publishing { publications { bar(MavenPublication) { groupId ''com.foo'' artifactId ''bar'' version ''0.1'' artifact(sourceJar) artifact("$buildDir/outputs/aar/bar-release.aar") pom.withXml { def dependenciesNode = asNode().appendNode(''dependencies'') //Iterate over the compile dependencies (we don''t want the test ones), adding a <dependency> node for each configurations.compile.allDependencies.each { if(it.group != null && (it.name != null || "unspecified".equals(it.name)) && it.version != null) { def dependencyNode = dependenciesNode.appendNode(''dependency'') dependencyNode.appendNode(''groupId'', it.group) dependencyNode.appendNode(''artifactId'', it.name) dependencyNode.appendNode(''version'', it.version) } } } } } repositories { maven { url "$buildDir/repo" } } }

Y puedes cambiar la version y groupId definiendo:

version = ''1.0.0'' group = ''foo.bar''


Aquí hay una muestra usando el nuevo plugin maven-publish .

apply plugin: ''maven-publish'' task sourceJar(type: Jar) { from android.sourceSets.main.java.srcDirs classifier "sources" } publishing { publications { bar(MavenPublication) { groupId ''com.foo'' artifactId ''bar'' version ''0.1'' artifact(sourceJar) artifact("$buildDir/outputs/aar/bar-release.aar") } } repositories { maven { url "$buildDir/repo" } } }

Publique con ./gradlew clean build publish