Comment convertir AAR en JAR

92

Situation :

J'ai l'intention d'utiliser une bibliothèque Java et je n'ai qu'un fichier AAR d'un référentiel Maven mais j'ai besoin du fichier JAR .

Histoire de fond:

J'ai essayé de compiler une bibliothèque, mais sa structure Gradle était instable. J'ai donc demandé un fichier jar compilé, et son développeur m'a remis un fichier aar d'un référentiel Maven (le développeur n'a pas pu compiler son propre projet). La configuration de Gradle était un gâchis, elle dépendait de plusieurs bibliothèques et Gradle a levé quelques exceptions.

J'ai essayé de l'utiliser dans mon IDEA IDE, mais il ne pouvait pas le voir. Un projet de bibliothèque devrait pouvoir être compilé dans un fichier jar, non?

Question :

Que dois-je faire pour convertir ce fichier AAR en fichier JAR?

Nestor
la source
1
Vous pouvez simplement le renommer en .jar mais sans connaître plus de détails sur votre environnement, cela peut ou non être ce que vous devez faire, un AAR est une bibliothèque Axis avec des utilisations spécifiques.
Pedantic
1
Vous allez rire, mais j'ai dû ajouter un mot non régulier parce que SO ne voulait pas que ma question soit publiée car elle était si simple. Et je suppose que cela dit tout ce que le développeur de la bibliothèque ne peut pas compiler son propre projet en utilisant Gradle ...
Nestor

Réponses:

141

Le fichier AAR se compose d'un fichier JAR et de quelques fichiers de ressources (il s'agit essentiellement d'un fichier zip standard avec une extension de fichier personnalisée). Voici les étapes pour convertir:

  1. Extrayez le fichier AAR à l'aide de l'extrait zip standard (renommez-le en * .zip pour le rendre plus facile)
  2. Trouvez le fichier classes.jar dans les fichiers extraits
  3. Renommez-le comme vous le souhaitez et utilisez ce fichier jar dans votre projet
Nestor
la source
53
Il est intéressant que cette réponse soit acceptée, car le simple fait de renommer un fichier jar et de le copier dans le répertoire libs de votre projet ne fonctionnera pas car les fichiers de ressources sont absents du fichier jar.
ChuongPham
Suite au tutoriel pour Spotify Android SDK, cette réponse était le remède. C'est parce que je développe des projets dans Netbeans, ce qui semble ne pas être conforme à l'extension AAR. La remarque de ChuongPham semble être liée non pas à cette réponse, mais à la réponse d'AWT, et puis je suis en partie d'accord avec ChuongPham, c'est-à-dire que le simple changement de nom d'AAR en JAR ne fonctionne pas. Cependant, je suis également en partie en désaccord car "resources" n'est pas pertinent pour le fichier classes.jar.
carl
11
J'ai eu du mal à trouver comment l'extraire sur mac, au cas où d'autres aussi: il suffit de changer .aar en .zip et de double-cliquer!
Bastien Beurier
5
alors quelle est la solution pour créer un pot basé sur les ressources?
2cupsOfTech
2
Cette solution extrait uniquement le fichier jar, mais les ressources ne le contiennent pas. Quelque chose ne va pas.
Tinker Sun
21

.aar est une archive zip standard, la même que celle utilisée dans .jar. Changez simplement l'extension et, en supposant qu'elle n'est pas corrompue ou quoi que ce soit, ça devrait aller.

Si vous en avez besoin, vous pouvez l'extraire sur votre système de fichiers, puis le reconditionner sous forme de fichier jar.

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)
AWT
la source
Lorsque je lance le jar xf, je n'obtiens rien: C: \ Program Files \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Files \ Java \ jdk1.7.0_25 \ bin>
Nestor
1
mec, l'étape 1 suffit. Renommez-le simplement en .jar. À mon avis, les étapes (2) et (3) sont inutiles
Dr Deo
@DrDeo Si je le renomme simplement, le projet eclipse ne le reconnaît pas comme une bibliothèque. Est-ce normal? Des indices?
Tanasis
1
Si vous le renommez simplement et ne le reconditionnez pas avec jar, il n'aura pas de manifeste et il ne le reconnaîtra pas comme un fichier jar valide, je crois.
AWT
16

Comme beaucoup d'autres personnes l'ont souligné, extraire simplement le .jar du fichier .aar ne le coupe pas tout à fait car des ressources peuvent manquer.

Voici les étapes qui ont fonctionné pour moi (dans le contexte d'Android, votre kilométrage peut varier si vous avez d'autres fins):

  1. Renommez le fichier .aar en .zip et extrayez-le.
  2. Le dossier extrait est un projet ADT que vous pouvez importer dans Eclipse avec quelques modifications mineures (voir ci-dessous)!
  3. Dans le dossier extrait, renommez le fichier contenu classes.jar en ce que vous voulez (dans cet exemple myProjectLib.jar) et déplacez-le vers le dossier lib dans le dossier extrait.
  4. Maintenant, pour qu'Eclipse l'accepte, vous devez placer deux fichiers dans la racine du dossier extrait:
    • .projet
    • .classpath
  5. Pour ce faire, créez un nouveau projet factice Android dans Eclipse et copiez les fichiers, ou copiez à partir d'un projet Android existant.
  6. Ouvrez le fichier .project et recherchez la balise de nom XML et remplacez le contenu de celui-ci par myProjectLib (ou tout ce que vous avez appelé votre fichier jar ci-dessus) et enregistrez.
  7. Maintenant, dans Eclipse, vous pouvez Fichier -> Nouveau -> Projet -> Projet Android à partir de la source existante. et pointer vers le contenu du dossier extrait.
  8. Après l'importation, faites un clic droit sur le projet nouvellement créé, sélectionnez Propriétés -> Android et cochez Est une bibliothèque .
  9. Dans votre projet principal pour lequel vous souhaitez utiliser la bibliothèque, accédez également à Propriétés -> Android et ajoutez le myProjectLib nouvellement ajouté à la liste des dépendances.
rsp1984
la source
Cela m'a aidé. Mais pour que cela fonctionne pleinement, j'avais besoin de créer un dossier "src" vide entre les étapes 6 et 7.
Bernhard Krenz
8

Pour ceux qui veulent le faire automatiquement, j'ai écrit un petit script bash de deux lignes qui fait les deux choses suivantes:

  1. Recherche tous les fichiers * .aar et en extrait classes.jar
  2. Renomme les classes extraites.jar pour être comme l'aar mais avec une nouvelle extension

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

C'est tout!

ddmytrenko
la source
1
Bien sûr, toute conversion aar2jar ne contiendra pas de ressources et ne se manifestera pas à l'intérieur. Nous pouvons dire (pas définitivement mais presque) cela aar=jar+res+manifest+libs. Laissez rest=res+manifest+libs, que jar(aar)=aar-rest.
ddmytrenko
C'est ce que je veux vraiment! Merci beaucoup. Mais cela augmente vraiment l'utilisation du disque. car chaque bibliothèque de support a plusieurs versions. décompressez seulement la dernière version peut être meilleure
iptton
6

Android Studio (version: 1.3.2) vous permet d'accéder de manière transparente au .jar dans un .aar.

Bonus: il décompile automatiquement les classes!

Suivez simplement ces étapes:

  1. File > New > New Module > Import .JAR/.AAR Package pour vous importer .aar en tant que module

  2. Ajoutez le module nouvellement créé en tant que dépendance à votre projet principal (pas sûr si nécessaire)

  3. Faites un clic droit sur "classes.jar" comme indiqué dans la capture ci-dessous, et cliquez sur "Afficher dans l'explorateur". Voici votre .jar.

accéder au .jar depuis .aar

Sébastien
la source
1
doit d'abord sélectionner le projet au lieu d'Android dans le gestionnaire de projet, puis les bibliothèques externes s'afficheront
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.

Remarque: Si vous souhaitez obtenir uniquement le fichier .jar de votre fichier .aar, utilisez la méthode ci-dessus. Supposons que si vous souhaitez inclure le manifeste.xml et les ressources avec votre fichier .jar, cela signifie que vous pouvez simplement cliquer avec le bouton droit sur votre fichier .aar et l'enregistrer directement en tant que fichier .jar au lieu de l'enregistrer au format .zip. Pour afficher le fichier .jar que vous avez extrait, téléchargez JD-GUI (Java Decompiler) . Ensuite, faites glisser et déposez votre fichier .jar dans ce JD_GUI, vous pouvez voir le fichier .class dans des formats lisibles comme un fichier .java.

entrez la description de l'image ici entrez la description de l'image ici

anand krish
la source
Cela signifie-t-il que nous pouvons utiliser le fichier AAR comme un fichier JAR simplement en le renommant de .aar en .jar?
Soumya
@Soumya, non, vous ne pouvez pas.
ddmytrenko
2
En fait, le sujet de la conversation est faux. Nous ne pouvons pas convertir AAR en JAR ou vice-versa. La seule chose que nous pouvons faire est "d'extraire le JAR d'AAR". Et j'ai écrit comment faire cela automatiquement en utilisant deux lignes de code Bash ici: stackoverflow.com/a/29252592/746529
ddmytrenko
4

Projets .aar basés sur les ressources

Trouver le fichier classes.jar dans le fichier .aar est assez simple. Cependant, cette approche ne fonctionne pas si le projet .aar a défini des ressources (exemple: R.layout.xyz)

  • Par conséquent, deaar de CommonsGuy m'a aidé à obtenir un projet compatible ADT valide à partir d'un fichier .aar. Dans mon cas, j'ai converti sous-échantillonnage-échelle-image-vue . Il m'a fallu environ une heure pour configurer ruby ​​sur mon PC.

  • Une autre approche consiste à utiliser android-maven-plugin pour Eclipse / ADT comme l'écrit CommonsGuy dans son blog .

  • Une autre approche pourrait être de simplement cloner l'ensemble du projet souhaité en tant que source depuis git et de l'importer en tant que "Projet Android existant"

Un seul monde
la source
1

Si vous utilisez Gradle pour vos builds - il existe un plugin Gradle qui vous permet d'ajouter une dépendance aar à vos modules 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
la source
En essayant de comprendre, est-il possible de créer 'compileOnlyAar' pour le plugin Android app / lib? Je sais que ce n'est pas à propos de votre bibliothèque, mais peut-être que vous savez est-ce possible puisque, le plugin Android ne contient pas de configuration d'artefact comme «compileOnlyAar». Vous pouvez comprendre pourquoi j'ai besoin de cette fonctionnalité ici ( stackoverflow.com/questions/60998072/… )
HeyAlex