Як конвертувати AAR в JAR


92

Ситуація :

Я маю намір використовувати бібліотеку Java, і у мене є лише файл AAR із сховища Maven, але мені потрібен файл JAR .

Історія:

Я намагався скомпілювати бібліотеку, але її структура Gradle була нестабільною. Тому я попросив скомпільований файл jar, і його розробник передав мені файл aar з якогось сховища Maven (розробник не зміг скомпілювати власний проект). Конфігурація Gradle була безладною, вона залежала від декількох бібліотек, і Gradle створив деякі винятки.

Я намагався використовувати його в IDEA IDE, але він не міг його побачити. Бібліотечний проект повинен бути зкомпонований у файл jar, так?

Питання :

Що робити, щоб перетворити цей файл AAR на файл JAR?


1
Ви можете просто перейменувати його назад у .jar, але, не знаючи більше деталей про ваше середовище, це може бути чи не бути тим, що вам потрібно зробити, AAR - це бібліотека Axis з конкретним використанням.
Педант

1
Ви будете сміятися, але мені довелося додати якесь нерегулярне слово, тому що ТО не дозволяв моєму питанню бути опублікованим, оскільки воно було таким простим формулюванням. І, мабуть, це розповідає все, що розробник бібліотеки не може скласти власний проект за допомогою Gradle ...
Нестор

Відповіді:


141

Файл AAR складається з файлу JAR та деяких файлів ресурсів (в основному це стандартний zip-файл із власним розширенням файлу). Ось кроки для перетворення:

  1. Витягніть файл AAR, використовуючи стандартний екстракт zip (перейменуйте його на * .zip, щоб полегшити)
  2. Знайдіть у витягнутих файлах файл classes.jar
  3. Перейменуйте його як завгодно і використовуйте цей файл jar у своєму проекті

53
Цікаво, що ця відповідь прийнята, оскільки просто перейменувати jar та скопіювати його до каталогу бібліотек вашого проекту не буде працювати через те, що в jar відсутні файли ресурсів.
ChuongPham

Відповідно до посібника для Spotify Android SDK, ця відповідь була засобом вирішення проблеми. Це тому, що я розробляю проекти в Netbeans, що, здається, не відповідає розширенню AAR. Зауваження ChuongPham, схоже, пов'язане не з цією відповіддю, а з відповіддю AWT, і тоді я частково погоджуюсь з ChuongPham, тобто просте перейменування з AAR на JAR не працює. Однак я також частково не погоджуюсь, оскільки "ресурси" не має значення для файлу classes.jar.
Карл

11
Мені було важко дізнатись, як витягти його на mac, на випадок, якщо теж інші: просто змініть .aar на .zip і двічі клацніть!
Bastien Beurier

5
отже, яке рішення для створення банки на основі ресурсів?
2cupsOfTech

2
Це рішення лише витягує файл jar, але ресурси в ньому не містяться. Щось було б не так.
Tinker Sun

21

.aar - це стандартний zip-архів, той самий, що використовується в .jar. Просто змініть розширення і, припускаючи, що воно не пошкоджене або щось інше, воно повинно бути нормальним.

Якщо вам це потрібно, ви можете витягти його у свою файлову систему, а потім перепакувати у банку.

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

Коли я запускаю jar xf, я нічого не отримую: C: \ Program Files \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Файли \ Java \ jdk1.7.0_25 \ bin>
Нестор

1
чувак, кроку 1 досить. Просто перейменуйте його на .jar. На мій погляд, кроки (2) та (3) марні
доктор Део,

@DrDeo Якщо я просто перейменую його, проект eclipse не визнає його бібліотекою. Це нормально? Будь-які підказки?
Танасіс

1
Якщо ви просто перейменуєте його і не перепакуєте його за допомогою jar, я вважаю, що у нього не буде маніфесту, і він не розпізнає його як дійсний файл jar.
AWT

16

Як зазначали багато інших людей, просто витяг .jar із файлу .aar не зовсім скорочує його, оскільки ресурси можуть бути відсутніми.

Ось кроки, які працювали для мене (у контексті Android, ваш пробіг може змінюватися, якщо у вас є інші цілі):

  1. Перейменуйте файл .aar на .zip і витягніть.
  2. Витягнута папка - це проект ADT, який ви можете імпортувати в Eclipse з невеликими змінами (див. Нижче)!
  3. У витягнутій папці перейменуйте вміщений файл classes.jar вміщений на будь-яке, що вам подобається (у цьому прикладі myProjectLib.jar) і перемістіть його в папку lib всередині вилученої папки.
  4. Тепер, щоб Eclipse прийняв його, потрібно помістити два файли в вилучену кореневу папку:
    • .проект
    • .класовий шлях
  5. Для цього створіть новий фіктивний проект Android в Eclipse і скопіюйте файли або скопіюйте з існуючого проекту Android.
  6. Відкрийте файл .project і знайдіть тег імені XML і замініть його вміст на myProjectLib (або те, що ви назвали своїм файлом jar вище) і збережіть.
  7. Тепер у Eclipse ви можете Файл -> Створити -> Проект -> Проект Android із існуючого джерела .. і вказати на вилучений вміст папки.
  8. Після імпортування клацніть правою кнопкою миші на нещодавно створений проект, виберіть Властивості -> Android і встановіть прапорець Бібліотека .
  9. У своєму основному проекті, для якого ви хочете використовувати бібліотеку, також перейдіть до Властивості -> Android і додайте нещодавно доданий myProjectLib до списку залежностей.

Це мені допомогло. Але для того, щоб отримати, якщо він повністю працює, мені потрібно було створити порожню папку "src" між кроками 6 і 7.
Бернхард Кренц,

8

Для тих, хто хоче зробити це автоматично, я написав невеликий дворядковий скрипт bash, який робить наступні дві речі:

  1. Шукає всі файли * .aar і витягує з них classes.jar
  2. Перейменовує витягнуті classes.jar, щоб бути як aar, але з новим розширенням

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

Це воно!


1
Звичайно, будь-яке перетворення aar2jar не буде містити ресурсів і маніфестувати всередині. Ми можемо сказати (не точно, але близько) aar=jar+res+manifest+libs. Нехай rest=res+manifest+libs, ніж jar(aar)=aar-rest.
ddmytrenko

Ось чого я справді хочу! Дуже дякую. Але це дійсно збільшує використання диска. тому що кожна бібліотека підтримки має багато версій. тільки розпакуйте останню версію, можливо, буде краще
iptton

6

Android Studio (версія: 1.3.2) дозволяє безперешкодно отримувати доступ до .jar всередині .aar.

Бонус: він автоматично декомпілює класи!

Просто виконайте такі дії:

  1. File > New > New Module > Import .JAR/.AAR Package щоб імпортувати вас .aar як модуль

  2. Додайте нещодавно створений модуль як залежність до свого основного проекту (не впевнений, якщо потрібно)

  3. Клацніть правою кнопкою миші на "classes.jar", як показано на знімку нижче, і натисніть "Показати у провіднику". Ось ваш .jar.

доступ до .jar із .aar


1
спочатку потрібно вибрати проект замість android у менеджері проектів, після чого з’являться зовнішні бібліотеки
Самад

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.

Примітка: Якщо ви хочете отримати лише файл .jar із вашого файлу .aar, скористайтеся наведеним вище способом. Припустимо, якщо ви хочете включити manifest.xml та ресурси у свій файл .jar, це означає, що ви можете просто клацнути правою кнопкою миші ваш файл .aar та зберегти його безпосередньо як файл .jar, замість того, щоб зберігати як .zip. Щоб переглянути файл .jar, який ви розпакували, завантажте JD-GUI (Java Decompiler) . Потім перетягніть ваш файл .jar у цей JD_GUI, ви зможете побачити файл .class у читабельних форматах, як-от .java файл.

введіть тут опис зображення введіть тут опис зображення


Чи означає це, що ми можемо використовувати файл AAR як файл JAR, просто перейменувавши його з .aar на .jar?
Soumya

@Soumya, ні, ти не можеш.
ddmytrenko

2
Насправді тема розмови неправильна. Ми не можемо перетворити AAR у JAR або навпаки. Єдине, що ми можемо зробити, це "витягнути JAR з AAR". І я написав , як зробити це з допомогою двох автоматично рядки Bash коду тут: stackoverflow.com/a/29252592/746529
ddmytrenko

4

Ресурсні .aar-проекти

Пошук файлу classes.jar всередині файлу .aar досить тривіальний. Однак такий підхід не працює, якщо проект .aar визначив деякі ресурси (приклад: R.layout.xyz)

  • Тому deaar із CommonsGuy допоміг мені отримати дійсний проект, зручний для ADT, із .aar-файлу. У моєму випадку я перетворив піддискретизацію масштабу-зображення-подання . На встановлення рубіну на моєму ПК у мене пішло близько години.

  • Інший підхід - використання плагіна android-maven-для Eclipse / ADT, як пише CommonsGuy у своєму блозі .

  • Ще один підхід може бути, просто клонувати весь бажаний проект як джерело з git та імпортувати його як "Існуючий проект Android"


1

Якщо ви використовуєте Gradle для своїх збірок - існує плагін Gradle, який дозволяє додавати залежність aar до ваших модулів 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
}

Намагаючись зрозуміти, чи можна зробити 'compileOnlyAar' для додатка Android / lib плагіна? я знаю, що справа не у вашій бібліотеці, але, можливо, ви знаєте, чи можливо це, оскільки плагін android не містить конфігурації артефактів, як-от 'compileOnlyAar'. Ви можете зрозуміти , чому мені потрібна ця функціональність тут ( stackoverflow.com/questions/60998072 / ... )
HeyAlex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.