java - una - Android Library Gradle release JAR
incluir jar en proyecto android (3)
¿Cómo puedo lanzar el paquete Jar del proyecto android-library
?
He encontrado que classes.jar se encuentra en build/bundles/release/classes.jar
y supongo que este es el paquete jar correcto (contiene archivos *.class
).
¿Hay alguna forma oficial de liberar la biblioteca como JAR en lugar de AAR?
Editar
Utilizo Gradle para liberar los artefactos de Maven, y me gustaría lanzar JAR junto con el paquete de AAR. Entonces JAR con firma, md5, manifiesto, ...
basado en https://chris.banes.me/2013/08/27/pushing-aars-to-maven-central/
apply plugin: ''maven''
apply plugin: ''signing''
configurations {
archives {
extendsFrom configurations.default
}
}
def sonatypeRepositoryUrl
if (isReleaseBuild()) {
println ''RELEASE BUILD''
sonatypeRepositoryUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
} else {
println ''DEBUG BUILD''
sonatypeRepositoryUrl = "https://oss.sonatype.org/content/repositories/snapshots/"
}
if(!hasProperty(''nexusPassword'')) {
ext.set(''nexusPassword'', System.console().readPassword("/n/$ Type in password for Sonatype nexus account " + nexusUsername + ": "))
}
if(!signing.hasProperty(''password'')) {
ext.set(''signing.password'', System.console().readPassword("/n/$ Type in GPG key password: "))
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.artifactId = POM_ARTIFACT_ID
repository(url: sonatypeRepositoryUrl) {
authentication(userName: nexusUsername, password: nexusPassword)
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
}
}
developers {
developer {
id "loopj"
name "James Smith"
}
developer {
id "smarek"
name "Marek Sebera"
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
}
task androidJavadocsJar(type: Jar) {
classifier = ''javadoc''
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = ''sources''
from android.sourceSets.main.java.srcDirs
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
utilizando
task androidJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
}
empaquetará solo los archivos java, no compilados y vinculados con sdk de Android
Otra forma de generar un jar desde un proyecto de biblioteca a través de gradle es la siguiente:
En build.gradle de tu biblioteca:
def jarName = ''someJarName.jar''
task clearJar(type: Delete) {
delete "${project.buildDir}/libs/" + jarName
}
task makeJar(type: Copy) {
from("${project.buildDir}/intermediates/bundles/release/")
into("${project.buildDir}/libs/")
include(''classes.jar'')
rename(''classes.jar'', jarName)
}
makeJar.dependsOn(clearJar, build)
Lo que estamos haciendo aquí es simplemente copiar las clases.jar generadas por el complemento Android Gradle. Asegúrese de buscar en su directorio de compilación para este archivo y ver si su contenido está en la forma que desea.
A continuación, ejecute la tarea makeJar
y el jar resultante estará en library / build / libs / ${jarName}
.jar
El tendrá los archivos de clase según su configuración para el lanzamiento. Si lo está ofuscando, los archivos en el contenedor se ofuscarán.
Si bien no he intentado subir los artefactos con una implementación a Sonatype (o incluso un repositorio local), esto es lo que logré idear hace unas semanas cuando intentaba abordar el mismo problema.
android.libraryVariants.all { variant ->
def name = variant.buildType.name
if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
return; // Skip debug builds.
}
def task = project.tasks.create "jar${name.capitalize()}", Jar
task.dependsOn variant.javaCompile
task.from variant.javaCompile.destinationDir
artifacts.add(''archives'', task);
}
Luego ejecuta lo siguiente:
./gradlew jarRelease
Solo porque las respuestas anteriores no se ajustaban a mis necesidades, comparto mi versión engañosa para generar un jar con las clases de proyecto y las dependencias aar / jar.
// A tricky jar operation, we want to generate a jar files that contains only the required classes used.
// Dependencies are in jar and aar, so we need to open the aar to extract the classes and put all at the same level
// (aar is a zip that contains classes.jar, the latter is a zip that contains .class files)
task jar(type: Jar) {
from {
List<File> allFiles = new ArrayList<>();
configurations.compile.collect {
for (File f : zipTree(it).getFiles()) {
if (f.getName().equals("classes.jar")) {
allFiles.addAll(zipTree(f).getAt("asFileTrees").get(0).getDir())
}
}
}
allFiles.add(new File(''build/intermediates/classes/release''))
allFiles // To return the result inside a lambda
}
archiveName( project.ext.appName + ''.jar'' )
}
Esto NO maneja los tipos / sabores de compilación, pero se puede adaptar (está bien construir sobre la versión de compilación sin sabor).
Si alguna vez tiene una solución más inteligente o más elegante, ¡por favor comparta!