Cómo convertir AAR a JAR

92

Situación :

Tengo la intención de usar una biblioteca de Java y solo tengo un archivo AAR de un repositorio de Maven, pero necesito el archivo JAR .

Historia de fondo:

Intenté compilar una biblioteca, pero su estructura de Gradle era inestable. Así que pedí un archivo jar compilado y su desarrollador me entregó un archivo aar de algún repositorio de Maven (el desarrollador no pudo compilar su propio proyecto). La configuración de Gradle fue un desastre, dependía de múltiples bibliotecas y Gradle ha arrojado algunas excepciones.

Traté de usarlo en mi IDEA IDE, pero no pude verlo. Un proyecto de biblioteca debería poder compilarse en un archivo jar, ¿verdad?

Pregunta :

¿Qué debo hacer para convertir ese archivo AAR en un archivo JAR?

Nestor
fuente
1
Puede simplemente cambiarle el nombre a .jar, pero sin conocer más detalles sobre su entorno, esto puede o no ser lo que necesita hacer, un AAR es una biblioteca de Axis con usos específicos.
Pedantic
1
Te reirás, pero tuve que agregar una palabra no regular porque SO no permitiría que mi pregunta se publicara porque estaba redactada de manera tan simple. Y supongo que dice todo lo que el desarrollador de la biblioteca no puede compilar su propio proyecto usando Gradle ...
Nestor

Respuestas:

141

El archivo AAR consta de un archivo JAR y algunos archivos de recursos (básicamente es un archivo zip estándar con una extensión de archivo personalizada). Estos son los pasos para convertir:

  1. Extraiga el archivo AAR utilizando un extracto zip estándar (cámbiele el nombre a * .zip para que sea más fácil)
  2. Encuentra el archivo classes.jar en los archivos extraídos
  3. Cambie el nombre que desee y use ese archivo jar en su proyecto
Nestor
fuente
53
Es interesante que se acepte esta respuesta, porque simplemente cambiar el nombre de un jar y copiarlo en el directorio libs de su proyecto no funcionará debido al hecho de que faltan los archivos de recursos en el jar.
ChuongPham
Siguiendo el tutorial para Spotify Android SDK, esta respuesta fue el remedio. Esto se debe a que desarrollo proyectos en Netbeans, que parece no cumplir con la extensión AAR. El comentario de ChuongPham parece estar relacionado no con esta respuesta, sino con la respuesta de AWT, y luego estoy de acuerdo en parte con ChuongPham, es decir, el simple cambio de nombre de AAR a JAR no funciona. Sin embargo, también estoy en parte en desacuerdo porque "recursos" no es relevante para el archivo classes.jar.
carl
11
Me costó mucho descubrir cómo extraerlo en mac, en caso de que otros también: simplemente cambie .aar a .zip y haga doble clic.
Bastien Beurier
5
entonces, ¿cuál es la solución para crear un jar basado en recursos?
2cupsOfTech
2
Esta solución solo extrae el archivo jar, pero los recursos que no contienen. Algo estaría mal.
Tinker Sun
21

.aar es un archivo zip estándar, el mismo que se usa en .jar. Simplemente cambie la extensión y, suponiendo que no esté corrupta ni nada, debería estar bien.

Si lo necesita, puede extraerlo a su sistema de archivos y luego volver a empaquetarlo como un frasco.

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)
AWT
fuente
Cuando ejecuto jar xf, no obtengo nada: C: \ Program Files \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Archivos \ Java \ jdk1.7.0_25 \ bin>
Nestor
1
amigo, el paso 1 es suficiente. Simplemente cámbiele el nombre a .jar. En mi opinión, los pasos (2) y (3) son inútiles
Dr. Deo
@DrDeo Si simplemente le cambio el nombre, el proyecto eclipse no lo reconoce como una biblioteca. ¿Es normal? ¿Alguna pista?
Tanasis
1
Si simplemente le cambia el nombre y no lo vuelve a empaquetar con jar, no tendrá un manifiesto y no lo reconocerá como un archivo jar válido, creo.
AWT
16

Como muchas otras personas han señalado, simplemente extraer el .jar del archivo .aar no es suficiente, ya que pueden faltar recursos.

Estos son los pasos que funcionaron para mí (contexto de Android, su millaje puede variar si tiene otros propósitos):

  1. Cambie el nombre del archivo .aar a .zip y extráigalo.
  2. La carpeta extraída es un proyecto ADT que puede importar en Eclipse con algunas modificaciones menores (ver más abajo).
  3. En la carpeta extraída, cambie el nombre del archivo que contiene classes.jar a lo que quiera (en este ejemplo myProjectLib.jar) y muévalo a la carpeta lib dentro de la carpeta extraída.
  4. Ahora, para que Eclipse lo acepte, debe colocar dos archivos en la raíz de la carpeta extraída:
    • .proyecto
    • .classpath
  5. Para hacerlo, cree un nuevo proyecto ficticio de Android en Eclipse y copie los archivos o cópielos de un proyecto de Android existente.
  6. Abra el archivo .project y busque la etiqueta de nombre XML y reemplace su contenido con myProjectLib (o como sea que haya llamado su archivo jar arriba) y guarde.
  7. Ahora en Eclipse puede Archivo -> Nuevo -> Proyecto -> Proyecto de Android desde una fuente existente ... y apuntar al contenido de la carpeta extraída.
  8. Después de importar, haga clic con el botón derecho en el proyecto recién creado, seleccione Propiedades -> Android y marque Es biblioteca .
  9. En su proyecto principal para el que desea usar la biblioteca, también vaya a Propiedades -> Android y agregue myProjectLib recién agregado a la lista de dependencias.
rsp1984
fuente
Eso me ayudó. Pero para que funcione completamente, necesitaba crear una carpeta "src" vacía entre el paso 6 y 7.
Bernhard Krenz
8

Para aquellos que quieren hacerlo automáticamente, he escrito un pequeño script bash de dos líneas que hace las siguientes dos cosas:

  1. Busca todos los archivos * .aar y extrae classes.jar de ellos
  2. Cambia el nombre de classes.jar extraído para que sea como el aar pero con una nueva extensión

    find . -name '*.aar' -exec sh -c 'unzip -d `dirname {}` {} classes.jar' \;
    find . -name '*.aar' -exec sh -c 'mv `dirname {}`/classes.jar `echo {} | sed s/aar/jar/g`' \;

¡Eso es!

ddmytrenko
fuente
1
Claro, cualquier conversión de aar2jar no contendrá recursos ni se manifestará en su interior. Podemos decir (no definitivamente pero cerca) eso aar=jar+res+manifest+libs. Vamos rest=res+manifest+libs, que jar(aar)=aar-rest.
ddmytrenko
¡Eso es lo que realmente quiero! Muchas gracias. Pero realmente aumenta el uso del disco. porque cada biblioteca de soporte tiene muchas versiones. solo descomprimir la última versión puede ser mejor
iptton
6

Android Studio (versión: 1.3.2) le permite acceder sin problemas al .jar dentro de un .aar.

Bono: ¡descompila automáticamente las clases!

Simplemente siga estos pasos:

  1. File > New > New Module > Import .JAR/.AAR Package para importar tu .aar como módulo

  2. Agregue el módulo recién creado como una dependencia a su proyecto principal (no estoy seguro si es necesario)

  3. Haga clic derecho en "classes.jar" como se muestra en la captura a continuación, y haga clic en "Mostrar en el explorador". Aquí está su .jar.

acceder a .jar desde .aar

Sébastien
fuente
1
primero debe seleccionar el proyecto en lugar de Android en el administrador de proyectos, luego se mostrarán las bibliotecas externas
Samad
5
 The 'aar' bundle is the binary distribution of an Android Library Project. .aar file 
 consists a JAR file and some resource files. You can convert it
 as .jar file using this steps

1) Copy the .aar file in a separate folder and Rename the .aar file to .zip file using 
 any winrar or zip Extractor software.

2) Now you will get a .zip file. Right click on the .zip file and select "Extract files". 
 Will get a folder which contains "classes.jar, resource, manifest, R.java,
 proguard(optional), libs(optional), assets(optional)".

3) Rename the classes.jar file as yourjarfilename.jar and use this in your project.

Nota: Si desea obtener solo el archivo .jar de su archivo .aar, utilice la forma anterior. Suponga que si desea incluir el manifest.xml y los recursos con su archivo .jar, significa que puede hacer clic derecho en su archivo .aar y guardarlo como archivo .jar directamente en lugar de guardarlo como .zip. Para ver el archivo .jar que ha extraído, descargue JD-GUI (Java Decompiler) . Luego arrastre y suelte su archivo .jar en este JD_GUI, puede ver el archivo .class en formatos legibles como un archivo .java.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

anand krish
fuente
¿Significa esto que podemos usar el archivo AAR como un archivo JAR simplemente renombrándolo de .aar a .jar?
Soumya
@Soumya, no, no puedes.
ddmytrenko
2
En realidad, el tema de la conversación es incorrecto. No podemos convertir AAR a JAR o viceversa. Lo único que podemos hacer es "extraer JAR de AAR". Y escribí cómo hacer esto automáticamente usando dos líneas de código Bash aquí: stackoverflow.com/a/29252592/746529
ddmytrenko
4

Proyectos .aar basados ​​en recursos

Encontrar el archivo classes.jar dentro del archivo .aar es bastante trivial. Sin embargo, ese enfoque no funciona, si el .aar-project definió algunos recursos (ejemplo: R.layout.xyz)

  • Por lo tanto, deaar de CommonsGuy me ayudó a obtener un proyecto válido compatible con ADT de un archivo .aar. En mi caso, convertí subsampling-scale-image-view . Me tomó alrededor de una hora configurar Ruby en mi PC.

  • Otro enfoque es usar android-maven-plugin para Eclipse / ADT como escribe CommonsGuy en su blog .

  • Otro enfoque más podría ser simplemente clonar todo el proyecto deseado como fuente desde git e importarlo como "Proyecto de Android existente".

Un mundo
fuente
1

Si está utilizando Gradle para sus compilaciones, hay un complemento de Gradle que le permite agregar dependencia aar a sus módulos java | kotlin | scala | ....

https://github.com/stepango/aar2jar

plugins {
    id 'java'
    id 'com.stepango.aar2jar' version 0.6 // <- this one
}

dependencies {
    compileOnlyAar "com.android.support:support-annotations:28.0.0" // <- Use any AAR dependencies
}
Stepango
fuente
Tratando de entender, ¿es posible hacer 'compileOnlyAar' para la aplicación de Android / el complemento lib? Sé que no se trata de su biblioteca, pero tal vez sepa si es posible, ya que el complemento de Android no contiene una configuración de artefactos como 'compileOnlyAar'. Puede comprender por qué necesito esta funcionalidad aquí ( stackoverflow.com/questions/60998072/… )
HeyAlex