So konvertieren Sie AAR in JAR

92

Situation :

Ich beabsichtige, eine Java-Bibliothek zu verwenden, und ich habe nur eine AAR- Datei aus einem Maven-Repository, aber ich benötige die JAR- Datei.

Hintergrundgeschichte:

Ich habe versucht, eine Bibliothek zu kompilieren, aber ihre Gradle-Struktur war instabil. Also bat ich um eine kompilierte JAR-Datei und der Entwickler gab mir eine AAR-Datei aus einem Maven-Repository (der Entwickler konnte sein eigenes Projekt nicht kompilieren). Die Gradle-Konfiguration war ein Chaos, sie hing von mehreren Bibliotheken ab und Gradle hat einige Ausnahmen ausgelöst.

Ich habe versucht, es in meiner IDEA IDE zu verwenden, aber es konnte es nicht sehen. Ein Bibliotheksprojekt sollte in eine JAR-Datei kompiliert werden können, oder?

Frage :

Was kann ich tun, um diese AAR-Datei in eine JAR-Datei zu konvertieren?

Nestor
quelle
1
Sie können es einfach wieder in .jar umbenennen. Ohne jedoch weitere Details zu Ihrer Umgebung zu kennen, ist dies möglicherweise eine Axis-Bibliothek mit bestimmten Verwendungszwecken.
Pedantic
1
Sie werden lachen, aber ich musste ein nicht reguläres Wort hinzufügen, weil SO meine Frage nicht posten ließ, da sie so einfach formuliert war. Und ich denke, es sagt alles, dass der Entwickler der Bibliothek sein eigenes Projekt nicht mit Gradle kompilieren kann ...
Nestor

Antworten:

141

Die AAR- Datei besteht aus einer JAR- Datei und einigen Ressourcendateien (es handelt sich im Grunde genommen um eine Standard-Zip-Datei mit einer benutzerdefinierten Dateierweiterung). Hier sind die Schritte zum Konvertieren:

  1. Extrahieren Sie die AAR-Datei mit dem Standard-Zip-Extrakt (benennen Sie sie zur Vereinfachung in * .zip um).
  2. Suchen Sie die Datei classes.jar in den extrahierten Dateien
  3. Benennen Sie es nach Belieben um und verwenden Sie diese JAR-Datei in Ihrem Projekt
Nestor
quelle
53
Interessant, dass diese Antwort akzeptiert wird, da das einfache Umbenennen eines JARs und das Kopieren in das libs-Verzeichnis Ihres Projekts nicht funktioniert, da die Ressourcendateien im JAR fehlen.
ChuongPham
Nach dem Tutorial für Spotify Android SDK war diese Antwort das Mittel. Dies liegt daran, dass ich Projekte in Netbeans entwickle, die anscheinend nicht mit der AAR-Erweiterung übereinstimmen. Die Bemerkung von ChuongPham scheint nicht mit dieser Antwort zu zusammenhängen, sondern mit der Antwort von AWT, und dann stimme ich teilweise ChuongPham zu, dh eine einfache Umbenennung von AAR in JAR funktioniert nicht. Ich bin jedoch auch teilweise anderer Meinung, da "Ressourcen" für die Datei classes.jar nicht relevant sind.
Carl
11
Es fiel mir schwer herauszufinden, wie ich es auf einem Mac extrahieren kann, falls auch andere: Ändern Sie einfach .aar in .zip und doppelklicken Sie!
Bastien Beurier
5
Was ist die Lösung für die Erstellung eines ressourcenbasierten JAR?
2cupsOfTech
2
Diese Lösung extrahiert nur die JAR-Datei, enthält jedoch keine darin enthaltenen Ressourcen. Etwas würde nicht stimmen.
Basteln So
21

.aar ist ein Standard-Zip-Archiv, das auch in .jar verwendet wird. Ändern Sie einfach die Erweiterung und vorausgesetzt, sie ist nicht beschädigt oder so, sollte sie in Ordnung sein.

Bei Bedarf können Sie es in Ihr Dateisystem extrahieren und dann als JAR neu verpacken.

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)
AWT
quelle
Wenn ich das jar xf ausführe, erhalte ich nichts: C: \ Programme \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Dateien \ Java \ jdk1.7.0_25 \ bin>
Nestor
1
Alter, Schritt 1 ist genug. Benennen Sie es einfach in .jar um. Aus meiner Sicht sind die Schritte (2) und (3) nutzlos
Dr. Deo
@DrDeo Wenn ich es nur umbenenne, erkennt das Eclipse-Projekt es nicht als Bibliothek. Es ist normal? Irgendwelche Hinweise?
Tanasis
1
Wenn Sie es einfach umbenennen und nicht mit jar neu verpacken, wird es kein Manifest geben und es wird meiner Meinung nach nicht als gültige jar-Datei erkannt.
AWT
16

Wie viele andere Leute bereits betont haben, reicht es nicht aus, die .jar-Datei aus der .aar-Datei zu extrahieren, da möglicherweise Ressourcen fehlen.

Hier sind die Schritte, die für mich funktioniert haben (im Kontext von Android kann Ihr Kilometerstand variieren, wenn Sie andere Zwecke haben):

  1. Benennen Sie die .aar-Datei in .zip um und extrahieren Sie sie.
  2. Der extrahierte Ordner ist ein ADT-Projekt, das Sie mit einigen geringfügigen Änderungen in Eclipse importieren können (siehe unten)!
  3. Benennen Sie im extrahierten Ordner die enthaltene Datei classes.jar um Sie nach um (in diesem Beispiel myProjectLib.jar) und verschieben Sie sie in den lib-Ordner im extrahierten Ordner.
  4. Damit Eclipse dies akzeptiert, müssen Sie zwei Dateien in den Stamm des extrahierten Ordners einfügen:
    • .Projekt
    • .classpath
  5. Erstellen Sie dazu ein neues Android-Dummy-Projekt in Eclipse und kopieren Sie die Dateien oder kopieren Sie sie aus einem vorhandenen Android-Projekt.
  6. Öffnen Sie die .project-Datei, suchen Sie nach dem XML-Namensschild und ersetzen Sie den Inhalt durch myProjectLib (oder wie auch immer Sie Ihre JAR-Datei oben genannt haben) und speichern Sie sie.
  7. Jetzt können Sie in Eclipse Datei -> Neu -> Projekt -> Android-Projekt aus vorhandener Quelle auswählen und auf den extrahierten Ordnerinhalt verweisen.
  8. Klicken Sie nach dem Import mit der rechten Maustaste auf das neu erstellte Projekt, wählen Sie Eigenschaften -> Android und aktivieren Sie Is Library .
  9. Gehen Sie in Ihrem Hauptprojekt, für das Sie die Bibliothek verwenden möchten, ebenfalls zu Eigenschaften -> Android und fügen Sie die neu hinzugefügte myProjectLib zur Liste der Abhängigkeiten hinzu.
rsp1984
quelle
Das hat mir geholfen. Aber um voll funktionsfähig zu werden, musste ich zwischen Schritt 6 und 7 einen leeren "src" -Ordner erstellen.
Bernhard Krenz
8

Für diejenigen, die es automatisch machen wollen, habe ich ein kleines zweizeiliges Bash-Skript geschrieben, das die nächsten zwei Dinge macht:

  1. Sucht nach allen * .aar-Dateien und extrahiert classes.jar daraus
  2. Benennt extrahierte classes.jar um, um wie aar zu sein, jedoch mit einer neuen Erweiterung

    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`' \;

Das ist es!

ddmytrenko
quelle
1
Sicher, jede aar2jar-Konvertierung enthält keine Ressourcen und manifestiert sich darin. Wir können das sagen (nicht definitiv, aber nah dran) aar=jar+res+manifest+libs. Lassen Sie rest=res+manifest+libs, als jar(aar)=aar-rest.
ddmytrenko
Das will ich wirklich! Vielen Dank. Aber es erhöht wirklich die Festplattennutzung. weil jede Support-Bibliothek viele Versionen hat. Nur die neueste Version entpacken kann besser sein
Iptton
6

Mit Android Studio (Version: 1.3.2) können Sie nahtlos auf die .jar-Datei in einer .aar-Datei zugreifen.

Bonus: Es dekompiliert automatisch die Klassen!

Befolgen Sie einfach diese Schritte:

  1. File > New > New Module > Import .JAR/.AAR Package um Sie .aar als Modul zu importieren

  2. Fügen Sie das neu erstellte Modul als Abhängigkeit zu Ihrem Hauptprojekt hinzu (nicht sicher, ob dies erforderlich ist).

  3. Klicken Sie mit der rechten Maustaste auf "classes.jar" (siehe Abbildung unten) und klicken Sie auf "Im Explorer anzeigen". Hier ist dein .jar.

Zugriff auf .jar von .aar

Sébastien
quelle
1
Zuerst muss im Projektmanager ein Projekt anstelle von Android ausgewählt werden, dann werden externe Bibliotheken
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.

Hinweis: Wenn Sie nur eine JAR-Datei aus Ihrer AAR-Datei abrufen möchten, gehen Sie wie oben beschrieben vor. Angenommen, wenn Sie die Datei manifest.xml und Ressourcen in Ihre JAR-Datei aufnehmen möchten, können Sie einfach mit der rechten Maustaste auf Ihre AAR-Datei klicken und diese direkt als JAR-Datei speichern, anstatt sie als ZIP-Datei zu speichern. Laden Sie JD-GUI (Java Decompiler) herunter, um die von Ihnen extrahierte JAR-Datei anzuzeigen . Ziehen Sie dann Ihre .jar-Datei per Drag & Drop in diese JD_GUI. Sie können die .class-Datei in lesbaren Formaten wie eine .java-Datei anzeigen.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

anand krish
quelle
Bedeutet dies, dass wir die AAR-Datei wie eine JAR-Datei verwenden können, indem wir sie einfach von .aar in .jar umbenennen?
Soumya
@ Soumya, nein, das kannst du nicht.
ddmytrenko
2
Eigentlich ist das Gesprächsthema falsch. Wir können AAR nicht in JAR konvertieren oder umgekehrt. Das einzige, was wir tun können, ist "JAR aus AAR extrahieren". Und ich habe hier geschrieben, wie man dies automatisch mit zwei Zeilen Bash-Code macht: stackoverflow.com/a/29252592/746529
ddmytrenko
4

Ressourcenbasierte .aar-Projekte

Das Finden der Datei classes.jar in der Datei .aar ist ziemlich trivial. Dieser Ansatz funktioniert jedoch nicht, wenn das .aar-Projekt einige Ressourcen definiert hat (Beispiel: R.layout.xyz).

  • Daher hat mir deaar von CommonsGuy geholfen, ein gültiges ADT-freundliches Projekt aus einer .aar-Datei zu erstellen. In meinem Fall habe ich die Subsampling-Scale-Image-Ansicht konvertiert . Ich habe ungefähr eine Stunde gebraucht, um Ruby auf meinem PC einzurichten.

  • Ein anderer Ansatz ist die Verwendung des Android-Maven-Plugins für Eclipse / ADT, wie CommonsGuy in seinem Blog schreibt .

  • Ein weiterer Ansatz könnte darin bestehen, das gesamte gewünschte Projekt als Quelle von git zu klonen und als "Vorhandenes Android-Projekt" zu importieren.

Eine Welt
quelle
1

Wenn Sie Gradle für Ihre Builds verwenden, gibt es ein Gradle-Plugin, mit dem Sie Ihren Java | Kotlin | Scala | ... -Modulen eine Abhängigkeit hinzufügen können.

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
quelle
Ist es möglich zu verstehen, ob es möglich ist, 'compileOnlyAar' für das Android App / Lib Plugin zu erstellen? Ich weiß, dass es nicht um Ihre Bibliothek geht, aber vielleicht wissen Sie, dass es möglich ist, da das Android-Plugin keine Artefaktkonfiguration wie 'compileOnlyAar' enthält. Sie können verstehen, warum ich diese Funktionalität hier benötige ( stackoverflow.com/questions/60998072/… )
HeyAlex