Как конвертировать AAR в JAR


93

Ситуация :

Я собираюсь использовать библиотеку Java, и у меня есть только файл AAR из репозитория Maven, но мне нужен файл JAR .

Предыстория:

Я пытался скомпилировать библиотеку, но ее структура Gradle была нестабильной. Поэтому я попросил скомпилированный файл jar, и его разработчик передал мне файл aar из какого-то репозитория Maven (разработчик не мог скомпилировать свой собственный проект). Конфигурация Gradle была беспорядочной, она зависела от нескольких библиотек, и Gradle выдавал некоторые исключения.

Я попытался использовать его в своей IDEA IDE, но он не смог его увидеть. Проект библиотеки должен быть скомпилирован в файл jar, верно?

Вопрос :

Что мне делать, чтобы преобразовать этот файл AAR в файл JAR?


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

1
Вы будете смеяться, но мне пришлось добавить какое-то необычное слово, потому что SO не позволил опубликовать мой вопрос, поскольку он был настолько прост. И я думаю, это говорит обо всем, что разработчик библиотеки не может скомпилировать свой собственный проект с помощью Gradle ...
Нестор

Ответы:


142

В AAR файл состоит из JAR - файла и некоторые файлы ресурсов (это в основном стандартный почтовый файл с расширением пользовательского файла). Вот шаги для преобразования:

  1. Распакуйте файл AAR, используя стандартный zip-архив (переименуйте его в * .zip чтобы было проще)
  2. Найдите в извлеченных файлах файл classes.jar
  3. Переименуйте его как хотите и используйте этот файл jar в своем проекте.

53
Интересно, что этот ответ принят, потому что просто переименовать банку и скопировать ее в каталог libs вашего проекта не получится из-за того, что файлы ресурсов отсутствуют в банке.
ChuongPham

Следуя руководству по Spotify Android SDK, этот ответ был решением. Это потому, что я разрабатываю проекты в Netbeans, что, похоже, не соответствует расширению AAR. Замечание ChuongPham, похоже, связано не с этим ответом, а с ответом AWT, и тогда я частично согласен с ChuongPham, т.е. простое переименование из AAR в JAR не работает. Однако я также частично не согласен, потому что «ресурсы» не имеют отношения к файлу classes.jar.
Карл

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

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

2
Это решение извлекает только файл jar, но ресурсы в нем не содержатся. Что-то не так.
Tinker Sun

21

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

Если вам нужно, вы можете извлечь его в свою файловую систему, а затем переупаковать как 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) бесполезны
Dr Deo

@DrDeo Если я просто переименую его, проект eclipse не распознает его как библиотеку. Это нормально? Какие-нибудь подсказки?
Tanasis

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

16

Как отмечали многие другие люди, простое извлечение .jar из файла .aar не совсем его сокращает, поскольку ресурсы могут отсутствовать.

Вот шаги, которые сработали для меня (в контексте Android ваш опыт может отличаться, если у вас есть другие цели):

  1. Переименуйте файл .aar в .zip и распакуйте.
  2. Извлеченная папка - это проект ADT, который вы можете импортировать в Eclipse с небольшими изменениями (см. Ниже)!
  3. В извлеченной папке переименуйте содержащийся файл classes.jar во все, что вам нравится (в этом примере myProjectLib.jar), и переместите его в папку lib в извлеченной папке.
  4. Теперь, чтобы Eclipse его принял, вам нужно поместить два файла в корень извлеченной папки:
    • .project
    • .classpath
  5. Для этого создайте новый фиктивный проект Android в Eclipse и скопируйте файлы или скопируйте из существующего проекта Android.
  6. Откройте файл .project и найдите тег имени XML, замените его содержимое на myProjectLib (или как вы там назвали свой файл jar) и сохраните.
  7. Теперь в Eclipse вы можете File -> New -> Project -> Android Project из существующего источника .. и указать на извлеченное содержимое папки.
  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. В моем случае я преобразовал представление изображения в масштабе подвыборки . На настройку Ruby на моем ПК у меня ушло около часа.

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

  • Еще один подход может заключаться в том, чтобы просто клонировать весь желаемый проект как исходный из git и импортировать его как «Существующий проект Android».


1

Если вы используете Gradle для своих сборок - есть плагин Gradle, который позволяет вам добавлять зависимость к вашим модулям 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 app / lib? Я знаю, что это не о вашей библиотеке, но, возможно, вы знаете, возможно ли это, поскольку плагин для Android не содержит конфигурации артефактов, такой как compileOnlyAar. Вы можете понять, зачем мне эта функция нужна здесь ( stackoverflow.com/questions/60998072/… )
HeyAlex
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.