Come convertire AAR in JAR


92

Situazione :

Ho intenzione di utilizzare una libreria Java e ho solo un file AAR da un repository Maven ma ho bisogno del file JAR .

Storia di fondo:

Ho provato a compilare una libreria, ma la sua struttura Gradle era instabile. Quindi ho chiesto un file jar compilato e il suo sviluppatore mi ha consegnato un file aar da alcuni repository Maven (lo sviluppatore non poteva compilare il proprio progetto). La configurazione di Gradle era un disastro, dipendeva da più librerie e Gradle ha lanciato alcune eccezioni.

Ho provato a usarlo nel mio IDEA IDE, ma non riuscivo a vederlo. Un progetto di libreria dovrebbe essere in grado di essere compilato in un file jar, giusto?

Domanda :

Cosa devo fare per convertire quel file AAR in un file JAR?


1
Puoi semplicemente rinominarlo in .jar ma senza conoscere ulteriori dettagli sul tuo ambiente questo potrebbe o meno essere ciò che devi fare, un AAR è una libreria Axis con usi specifici.
Pedante

1
Ti verrà da ridere, ma ho dovuto aggiungere qualche parola non normale perché SO non ha permesso che la mia domanda fosse pubblicata perché era così semplice. E immagino che dica tutto ciò che lo sviluppatore della libreria non può compilare il proprio progetto usando Gradle ...
Nestor

Risposte:


141

Il file AAR è costituito da un file JAR e da alcuni file di risorse (è fondamentalmente un file zip standard con un'estensione di file personalizzata). Ecco i passaggi per convertire:

  1. Estrai il file AAR usando l'estrazione zip standard (rinominalo in * .zip per renderlo più semplice)
  2. Trova il file classes.jar nei file estratti
  3. Rinominalo come preferisci e usa quel file jar nel tuo progetto

53
È interessante che questa risposta sia accettata, perché semplicemente rinominare un jar e copiarlo nella directory libs del progetto non funzionerà a causa del fatto che i file di risorse mancano dal jar.
ChuongPham

Seguendo il tutorial per Spotify Android SDK, questa risposta è stata il rimedio. Questo perché sviluppo progetti in Netbeans, che sembra non essere conforme all'estensione AAR. L'osservazione di ChuongPham sembra essere correlata non a questa risposta, ma alla risposta di AWT, e quindi sono in parte d'accordo con ChuongPham, cioè la semplice ridenominazione da AAR a JAR non funziona. Tuttavia, sono anche in parte in disaccordo perché "risorse" non è rilevante per il file classes.jar.
carl

11
Ho avuto difficoltà a scoprire come estrarlo su Mac, nel caso anche altri: basta cambiare .aar in .zip e fare doppio clic!
Bastien Beurier

5
quindi qual è la soluzione per creare un vaso basato sulle risorse?
2cupsOfTech

2
Questa soluzione estrae solo il file jar, ma le risorse non lo contengono. Qualcosa non andrebbe.
Tinker Sun

21

.aar è un archivio zip standard, lo stesso utilizzato in .jar. Basta cambiare l'estensione e, supponendo che non sia danneggiata o altro, dovrebbe andare bene.

Se necessario, puoi estrarlo nel tuo filesystem e quindi ricompilarlo come un vaso.

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)

Quando eseguo il jar xf, non ottengo nulla: 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
amico, il passaggio 1 è sufficiente. Rinominalo semplicemente in .jar. A mio avviso i passaggi (2) e (3) sono inutili
Dr Deo

@DrDeo Se solo lo rinomino, il progetto eclipse non lo riconosce come libreria. È normale? Qualche indizio?
Tanasis

1
Se lo rinomini e non lo ricomponi con jar, non avrà un manifest e non lo riconoscerà come un file jar valido, credo.
AWT

16

Come molte altre persone hanno sottolineato, la semplice estrazione del .jar dal file .aar non lo taglia del tutto in quanto potrebbero mancare delle risorse.

Ecco i passaggi che hanno funzionato per me (contesto di Android, il tuo chilometraggio può variare se hai altri scopi):

  1. Rinomina il file .aar in .zip ed estrai.
  2. La cartella estratta è un progetto ADT che puoi importare in Eclipse con alcune piccole modifiche (vedi sotto)!
  3. Nella cartella estratta rinomina il file contenuto classes.jar come preferisci (in questo esempio myProjectLib.jar) e spostalo nella cartella lib all'interno della cartella estratta.
  4. Ora, affinché Eclipse lo accetti, è necessario inserire due file nella radice della cartella estratta:
    • .progetto
    • .classpath
  5. Per fare ciò, crea un nuovo progetto fittizio Android in Eclipse e copia i file o copia da un progetto Android esistente.
  6. Apri il file .project e cerca il tag XML e sostituisci il contenuto con myProjectLib (o qualunque cosa tu abbia chiamato il tuo file jar sopra) e salva.
  7. Ora in Eclipse puoi File -> Nuovo -> Progetto -> Progetto Android dalla sorgente esistente .. e puntare al contenuto della cartella estratta.
  8. Dopo l'importazione, fai clic con il pulsante destro del mouse sul progetto appena creato, seleziona Proprietà -> Android e seleziona È libreria .
  9. Nel progetto principale per il quale desideri utilizzare la libreria, vai anche su Proprietà -> Android e aggiungi il myProjectLib appena aggiunto all'elenco delle dipendenze.

Questo mi ha aiutato. Ma per essere completamente funzionante, avevo bisogno di creare una cartella "src" vuota tra i passaggi 6 e 7.
Bernhard Krenz

8

Per coloro che vogliono farlo automaticamente, ho scritto un piccolo script bash di due righe che fa le due cose seguenti:

  1. Cerca tutti i file * .aar e ne estrae classes.jar
  2. Rinomina classes.jar estratto in modo che sia come aar ma con una nuova estensione

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

Questo è tutto!


1
Certo, qualsiasi conversione aar2jar non conterrà risorse e manifest all'interno. Possiamo dirlo (non in modo definitivo ma vicino a) aar=jar+res+manifest+libs. Lascia rest=res+manifest+libs, che jar(aar)=aar-rest.
ddmytrenko

Questo è quello che voglio davvero! Molte grazie. Ma aumenta davvero l'utilizzo del disco. perché ogni libreria di supporto ha molte versioni. solo decomprimere l'ultima versione potrebbe essere migliore
iptton

6

Android Studio (versione: 1.3.2) ti consente di accedere senza problemi al file .jar all'interno di un file .aar.

Bonus: decompila automaticamente le classi!

Segui semplicemente questi passaggi:

  1. File > New > New Module > Import .JAR/.AAR Package per importarti .aar come modulo

  2. Aggiungi il modulo appena creato come dipendenza al tuo progetto principale (non sono sicuro se necessario)

  3. Fare clic con il pulsante destro del mouse su "classes.jar" come mostrato nell'immagine sottostante e fare clic su "Mostra in explorer". Ecco il tuo .jar.

accedere a .jar da .aar


1
prima devi selezionare il progetto invece di Android nel project manager, quindi le librerie esterne verranno visualizzate
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: se si desidera ottenere solo il file .jar dal file .aar, utilizzare il metodo precedente. Supponiamo che se desideri includere manifest.xml e risorse con il tuo file .jar significa che puoi semplicemente fare clic con il pulsante destro del mouse sul tuo file .aar e salvarlo direttamente come file .jar invece di salvarlo come .zip. Per visualizzare il file .jar che hai estratto, scarica JD-GUI (Java Decompiler) . Quindi trascina e rilascia il tuo file .jar in questo JD_GUI, puoi vedere il file .class in formati leggibili come un file .java.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


Questo significa che possiamo usare il file AAR come un file JAR semplicemente rinominandolo da .aar a .jar?
Soumya

@ Soumya, no, non puoi.
ddmytrenko

2
In realtà l'argomento della conversazione è sbagliato. Non possiamo convertire AAR in JAR o viceversa. L'unica cosa che possiamo fare è "estrarre JAR da AAR". E ho scritto come fare questo automaticamente utilizzando due linee di codice Bash qui: stackoverflow.com/a/29252592/746529
ddmytrenko

4

Progetti .aar basati su risorse

Trovare il file classes.jar all'interno del file .aar è piuttosto banale. Tuttavia, questo approccio non funziona, se il progetto .aar ha definito alcune risorse (esempio: R.layout.xyz)

  • Pertanto deaar di CommonsGuy mi ha aiutato a ottenere un valido progetto compatibile con ADT da un file .aar. Nel mio caso ho convertito sottocampionamento-scala-immagine-vista . Mi ci è voluta circa un'ora per configurare Ruby sul mio PC.

  • Un altro approccio consiste nell'usare il plugin android-maven per Eclipse / ADT, come scrive CommonsGuy nel suo blog .

  • Un altro approccio potrebbe essere semplicemente clonare l'intero progetto desiderato come sorgente da git e importarlo come "Progetto Android esistente"


1

Se stai usando Gradle per le tue build, c'è un plugin Gradle che ti permette di aggiungere una dipendenza aar ai tuoi moduli 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
}

Cercando di capire, è possibile creare 'compileOnlyAar' per il plug-in app / lib Android? So che non si tratta della tua libreria, ma forse sai che è possibile dal momento che il plugin Android non contiene la configurazione degli artefatti come 'compileOnlyAar'. Si può capire il motivo per cui ho bisogno di questa funzionalità qui ( stackoverflow.com/questions/60998072/... )
HeyAlex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.