Jak przekonwertować AAR na JAR


93

Sytuacja :

Zamierzam użyć biblioteki Java i mam tylko plik AAR z repozytorium Maven, ale potrzebuję pliku JAR .

Opowieść w tle:

Próbowałem skompilować bibliotekę, ale jej struktura Gradle była niestabilna. Poprosiłem więc o skompilowany plik jar, a jego programista wręczył mi plik aar z jakiegoś repozytorium Mavena (deweloper nie mógł skompilować własnego projektu). Konfiguracja Gradle była bałaganem, zależała od wielu bibliotek, a Gradle rzucił kilka wyjątków.

Próbowałem go użyć w moim IDEA IDE, ale nie mógł tego zobaczyć. Projekt biblioteki powinien dać się skompilować do pliku jar, prawda?

Pytanie 30 :

Co powinienem zrobić, aby przekonwertować ten plik AAR do pliku JAR?


1
Możesz po prostu zmienić jego nazwę z powrotem na .jar, ale bez znajomości więcej szczegółów na temat środowiska może to być lub nie to, co musisz zrobić, AAR to biblioteka Axis o określonych zastosowaniach.
Pedantic

1
Będziesz się śmiał, ale musiałem dodać jakieś nieregularne słowo, ponieważ SO nie pozwoliłby opublikować mojego pytania, ponieważ było tak proste. I wydaje mi się, że mówi wszystko, że programista biblioteki nie może skompilować własnego projektu za pomocą Gradle ...
Nestor

Odpowiedzi:


142

Plik AAR składa się z pliku JAR i niektórych plików zasobów (jest to w zasadzie standardowy plik zip z niestandardowym rozszerzeniem). Oto kroki do konwersji:

  1. Rozpakuj plik AAR za pomocą standardowego rozpakowywania zip (zmień jego nazwę na * .zip, aby było to łatwiejsze)
  2. Znajdź plik classes.jar w wyodrębnionych plikach
  3. Zmień nazwę, jak chcesz i użyj tego pliku jar w swoim projekcie

53
Ciekawe, że ta odpowiedź jest akceptowana, ponieważ po prostu zmiana nazwy jar i skopiowanie go do katalogu libs twojego projektu nie zadziała z powodu braku plików zasobów w jar.
ChuongPham

Postępując zgodnie z samouczkiem dotyczącym Spotify Android SDK, ta odpowiedź była rozwiązaniem. Dzieje się tak, ponieważ rozwijam projekty w Netbeans, co wydaje się być niezgodne z rozszerzeniem AAR. Uwaga ChuongPham wydaje się być związana nie z tą odpowiedzią, ale z odpowiedzią AWT, a potem zgadzam się częściowo z ChuongPham, tj. Prosta zmiana nazwy z AAR na JAR nie działa. Jednak częściowo się z tym nie zgadzam, ponieważ „zasoby” nie są istotne dla pliku classes.jar.
Carl

11
Trudno mi było dowiedzieć się, jak wyodrębnić go na Macu, na wypadek gdyby inni też: po prostu zmień .aar na .zip i kliknij dwukrotnie!
Bastien Beurier

5
więc jakie jest rozwiązanie do tworzenia słoika opartego na zasobach?
2cupsOfTech

2
To rozwiązanie wyodrębnia tylko plik jar, ale nie zawiera zasobów. Coś byłoby nie tak.
Tinker Sun,

21

.aar to standardowe archiwum zip, takie samo jak w .jar. Po prostu zmień rozszerzenie i zakładając, że nie jest uszkodzone ani nic, powinno być w porządku.

W razie potrzeby możesz wyodrębnić go do swojego systemu plików, a następnie przepakować go jako słoik.

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

Po uruchomieniu jar xf nic nie widzę: C: \ Program Files \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Pliki \ Java \ jdk1.7.0_25 \ bin>
Nestor

1
stary, krok 1 wystarczy. Po prostu zmień jego nazwę na .jar. Moim zdaniem kroki (2) i (3) są bezużyteczne
Dr Deo,

@DrDeo Jeśli zmienię nazwę, projekt eclipse nie rozpozna go jako biblioteki. Jest to normalne? Jakieś wskazówki?
Tanasis

1
Jeśli po prostu zmienisz jego nazwę i nie przepakujesz go za pomocą jar, nie będzie miał manifestu i nie rozpozna go jako prawidłowego pliku jar, jak sądzę.
AWT

16

Jak zauważyło wiele innych osób, samo wyodrębnienie pliku .jar z pliku .aar nie powoduje jego całkowitego usunięcia, ponieważ może brakować zasobów.

Oto kroki, które zadziałały dla mnie (w kontekście Androida, Twój przebieg może się różnić, jeśli masz inne cele):

  1. Zmień nazwę pliku .aar na .zip i rozpakuj.
  2. Wyodrębniony folder to projekt ADT, który można zaimportować do Eclipse z niewielkimi modyfikacjami (patrz poniżej)!
  3. W wyodrębnionym folderze zmień nazwę zawartego pliku classes.jar na dowolny (w tym przykładzie myProjectLib.jar) i przenieś go do folderu lib w wyodrębnionym folderze.
  4. Teraz, aby Eclipse zaakceptował to, musisz umieścić dwa pliki w wyodrębnionym folderze głównym:
    • .projekt
    • .classpath
  5. Aby to zrobić, utwórz nowy projekt fikcyjny Androida w Eclipse i skopiuj pliki lub skopiuj z istniejącego projektu Androida.
  6. Otwórz plik .project i poszukaj znacznika XML i zamień jego zawartość na myProjectLib (lub jakkolwiek nazwałeś swój plik jar powyżej) i zapisz.
  7. Teraz w Eclipse możesz Plik -> Nowy -> Projekt -> Projekt Android z istniejącego źródła .. i wskazać wyodrębnioną zawartość folderu.
  8. Po zaimportowaniu kliknij prawym przyciskiem myszy nowo utworzony projekt, wybierz Właściwości -> Android i zaznacz Czy biblioteka .
  9. W swoim głównym projekcie, do którego chcesz używać biblioteki, przejdź również do Właściwości -> Android i dodaj nowo dodany plik myProjectLib do listy zależności.

To mi pomogło. Aby jednak wszystko działało, musiałem utworzyć pusty folder „src” między krokiem 6 a 7.
Bernhard Krenz

8

Dla tych, którzy chcą to robić automatycznie, napisałem mały dwuwierszowy skrypt basha, który robi dwie następne rzeczy:

  1. Wyszukuje wszystkie pliki * .aar i wyodrębnia z nich pliki classes.jar
  2. Zmienia nazwy wyodrębnionych klas.jar tak, aby przypominały aar, ale z nowym rozszerzeniem

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

Otóż ​​to!


1
Jasne, żadna konwersja aar2jar nie będzie zawierać zasobów i manifestów wewnątrz. Możemy to powiedzieć (nie zdecydowanie, ale blisko) aar=jar+res+manifest+libs. Pozwól rest=res+manifest+libs, niż jar(aar)=aar-rest.
ddmytrenko

Tego naprawdę chcę! Wielkie dzięki. Ale to naprawdę zwiększa użycie dysku. ponieważ każda biblioteka wsparcia ma wiele wersji. tylko rozpakuj najnowszą wersję może być lepsza
iptton

6

Android Studio (wersja: 1.3.2) umożliwia bezproblemowy dostęp do .jar wewnątrz .aar.

Bonus: automatycznie dekompiluje klasy!

Po prostu wykonaj następujące kroki:

  1. File > New > New Module > Import .JAR/.AAR Package aby zaimportować cię .aar jako moduł

  2. Dodaj nowo utworzony moduł jako zależność do głównego projektu (nie jesteś pewien, czy to konieczne)

  3. Kliknij prawym przyciskiem myszy „classes.jar”, ​​jak pokazano na poniższym zrzucie, i kliknij „Pokaż w eksploratorze”. Oto twój .jar.

dostęp do .jar z .aar


1
najpierw należy wybrać projekt zamiast androida w menedżerze projektów, wtedy zewnętrzne biblioteki pokażą
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.

Uwaga: jeśli chcesz pobrać tylko plik .jar z pliku .aar, skorzystaj z powyższego sposobu. Załóżmy, że jeśli chcesz dołączyć manifest.xml i zasoby do pliku .jar, możesz po prostu kliknąć prawym przyciskiem myszy plik .aar i zapisać go bezpośrednio jako plik .jar zamiast zapisywać go jako .zip. Aby wyświetlić rozpakowany plik .jar, pobierz JD-GUI (Java Decompiler) . Następnie przeciągnij i upuść plik .jar do tego JD_GUI, możesz zobaczyć plik .class w czytelnych formatach, takich jak .java.

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj


Czy to oznacza, że ​​możemy używać pliku AAR jak pliku JAR, po prostu zmieniając jego nazwę z .aar na .jar?
Soumya

@Soumya, nie, nie możesz.
ddmytrenko

2
Właściwie temat rozmowy jest błędny. Nie możemy przekonwertować AAR na JAR ani odwrotnie. Jedyne, co możemy zrobić, to „wyodrębnić JAR z AAR”. A jak to zrobić automatycznie napisałem, używając dwóch wierszy kodu Bash tutaj: stackoverflow.com/a/29252592/746529
ddmytrenko

4

Projekty .aar oparte na zasobach

Znalezienie pliku classes.jar w pliku .aar jest dość trywialne. Jednak to podejście nie działa, jeśli .aar-project zdefiniował jakieś zasoby (przykład: R.layout.xyz)

  • Dlatego Deaar z CommonsGuy pomógł mi wyciągnąć z pliku .aar ważny projekt przyjazny dla ADT. W moim przypadku przekonwertowałem widok obrazu w skali podpróbkowania . Konfiguracja Rubiego na moim komputerze zajęła mi około godziny.

  • Innym podejściem jest użycie android-maven-plugin dla Eclipse / ADT, jak pisze CommonsGuy na swoim blogu .

  • Jeszcze innym podejściem może być sklonowanie całego żądanego projektu jako źródła z gita i zaimportowanie go jako „Istniejący projekt Android”


1

Jeśli używasz Gradle do swoich kompilacji - dostępna jest wtyczka Gradle, która pozwala na dodanie zależności aar do modułów 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
}

Próbując zrozumieć, czy jest możliwe utworzenie „compileOnlyAar” dla aplikacji / wtyczki lib na Androida? Wiem, że nie chodzi o twoją bibliotekę, ale może wiesz, że to możliwe, ponieważ wtyczka Androida nie zawiera konfiguracji artefaktów, takich jak „compileOnlyAar”. Możesz zrozumieć, dlaczego potrzebuję tej funkcji tutaj ( stackoverflow.com/questions/60998072/ ... )
HeyAlex
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.