AAR에서 JAR로 변환하는 방법


92

상황 :

Java 라이브러리를 사용하려고 하고 Maven 저장소 의 AAR 파일 만 있지만 JAR 파일 이 필요 합니다.

배경 이야기 :

라이브러리를 컴파일하려고했지만 Gradle 구조가 불안정했습니다. 그래서 컴파일 된 jar 파일을 요청했고 그 개발자는 일부 Maven 저장소에서 aar 파일을 건네주었습니다 (개발자는 자신의 프로젝트를 컴파일 할 수 없었습니다). Gradle 구성은 엉망이었고 여러 라이브러리에 의존했으며 Gradle은 몇 가지 예외를 던졌습니다.

내 IDEA IDE에서 사용하려고했지만 보이지 않았습니다. 라이브러리 프로젝트는 jar 파일로 컴파일 할 수 있어야합니다. 그렇죠?

질문 :

AAR 파일을 JAR 파일로 변환하려면 어떻게해야합니까?


1
이름을 .jar로 다시 바꿀 수 있지만 환경에 대한 자세한 내용을 알지 못해도 수행해야 할 작업 일 수도 있고 아닐 수도 있습니다. AAR은 특정 용도를 가진 Axis 라이브러리입니다.
— Pedantic

1
당신은 웃을 것입니다. 그러나 나는 너무 단순한 단어이기 때문에 내 질문이 게시되는 것을 허용하지 않기 때문에 비정규 단어를 추가해야했습니다. 그리고 나는 그것을 라이브러리의 개발자가 ... Gradle을을 사용하여 자신의 프로젝트를 컴파일 할 수없는 모든 것을 말한다 추측
— 네스터

답변:


141

AAR의 파일은 구성 의 JAR 파일 및 일부 리소스 파일 (이것은 기본적으로 사용자 정의 파일 확장명을 가진 표준 zip 파일)입니다. 변환하는 단계는 다음과 같습니다.

  1. 표준 zip 추출을 사용하여 AAR 파일의 압축을 풉니 다 ( 쉽도록 * .zip 으로 이름 변경 ).
  2. 추출 된 파일에서 classes.jar 파일을 찾으십시오.
  3. 원하는대로 이름을 바꾸고 프로젝트에서 해당 jar 파일을 사용하십시오.

53
이 답변이 허용된다는 점에 흥미 롭습니다. 단순히 jar의 이름을 바꾸고 프로젝트의 libs 디렉토리에 복사하면 jar에서 리소스 파일이 누락되어 작동하지 않기 때문입니다.
— ChuongPham 2014 년

Spotify Android SDK에 대한 자습서에 따라이 답변이 해결책이었습니다. AAR 확장을 준수하지 않는 것처럼 보이는 Netbeans에서 프로젝트를 개발하기 때문입니다. ChuongPham의 발언은이 답변이 아니라 AWT의 답변과 관련이있는 것 같습니다. 그리고 저는 ChuongPham에 부분적으로 동의합니다. 즉, AAR에서 JAR 로의 간단한 이름 변경이 작동하지 않습니다. 그러나 "resources"가 classes.jar 파일과 관련이 없기 때문에 부분적으로 동의하지 않습니다.
— carl

11
다른 사람들도 Mac에서 추출하는 방법을 찾기가 어려웠습니다. .aar를 .zip으로 변경하고 두 번 클릭하십시오!
— Bastien Beurier 2015 년

5
그래서 자원 기반 항아리를 만드는 해결책은 무엇입니까?
— 2cupsOfTech 2015

2
이 솔루션은 jar 파일 만 추출하지만 리소스에는 포함되지 않습니다. 뭔가 잘못되었을 것입니다.
— Tinker Sun

21

.aar는 .jar에서 사용되는 것과 동일한 표준 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 Files \ Java \ jdk1.7.0_25 \ bin>
— Nestor

1
친구, 1 단계면 충분합니다. .jar로 이름을 바꾸십시오. 내 관점에서 (2)와 (3) 단계는 쓸모가 없습니다
— Dr Deo

@DrDeo 이름을 바꾸면 Eclipse 프로젝트가 라이브러리로 인식하지 못합니다. 정상인가요? 단서가 있습니까?
— Tanasis

1
이름을 바꾸고 jar로 다시 패키지하지 않으면 매니페스트가 없으며 유효한 jar 파일로 인식되지 않습니다.
— AWT

16

다른 많은 사람들이 지적했듯이 .aar 파일에서 .jar를 추출하는 것만으로는 리소스가 누락 될 수 있으므로 잘리지 않습니다.

저에게 도움이 된 단계는 다음과 같습니다 (Android 컨텍스트, 다른 목적이있는 경우 마일리지가 다를 수 있음).

  1. .aar 파일의 이름을 .zip으로 바꾸고 압축을 풉니 다.
  2. 추출 된 폴더는 약간의 수정을 통해 Eclipse에서 가져올 수있는 ADT 프로젝트입니다 (아래 참조)!
  3. 추출 된 폴더에서 포함 된 파일 classes.jar의 이름 을 원하는대로 바꾸고 (이 예제에서는 myProjectLib.jar) 추출 된 폴더 내의 lib 폴더로 이동하십시오.
  4. 이제 Eclipse에서이를 승인하려면 추출 된 폴더 루트에 두 개의 파일을 넣어야합니다.
    • .계획
    • .classpath
  5. 이를 위해 Eclipse에서 새 Android 더미 프로젝트를 만들고 파일을 복사하거나 기존 Android 프로젝트에서 복사합니다.
  6. .project 파일을 열고 XML 이름 태그를 찾아서 그 내용을 myProjectLib (또는 위에서 jar 파일이라고 부르는 이름)으로 바꾸고 저장합니다.
  7. 이제 Eclipse에서 File-> New-> Project-> Android Project from existing source .. 할 수 있으며 추출 된 폴더 내용을 가리 킵니다.
  8. 가져 오기 후 새로 생성 된 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Properties-> Android를 선택 하고 Is Library를 확인합니다. 합니다.
  9. 라이브러리를 사용하려는 기본 프로젝트에서 속성-> Android 로 이동 하여 새로 추가 된 myProjectLib를 종속성 목록에 추가합니다.

이것은 나를 도왔다. 완벽하게 작동하지만 위해 얻기 위해, 나는 6 단계와 7 사이에 빈 "SRC"폴더를 만드는 데 필요한
— 베른하르트 크 렌츠에게

8

자동으로 수행하려는 사람들을 위해 다음 두 가지 작업을 수행하는 2 줄짜리 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)를 사용하면 .aar 내의 .jar에 원활하게 액세스 할 수 있습니다.

보너스 : 자동으로 클래스를 디 컴파일합니다!

다음 단계를 따르십시오.

  1. File > New > New Module > Import .JAR/.AAR Package .aar를 모듈로 가져 오려면

  2. 새로 생성 된 모듈을 기본 프로젝트에 대한 종속성으로 추가합니다 (필요한 경우 확실하지 않음).

  3. 아래 캡처에 표시된대로 "classes.jar"를 마우스 오른쪽 단추로 클릭하고 "탐색기에 표시"를 클릭하십시오. 다음은 .jar입니다.

.aar에서 .jar에 액세스


1
먼저 프로젝트 관리자에서 android 대신 프로젝트를 선택해야합니다. 그러면 외부 라이브러리에 표시됩니다
— 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.

참고 : .aar 파일에서 .jar 파일 만 가져 오려면 위의 방법을 사용하십시오. .jar 파일에 manifest.xml 및 리소스를 포함하려면 .aar 파일을 마우스 오른쪽 버튼으로 클릭하고 .zip으로 저장하는 대신 직접 .jar 파일로 저장할 수 있습니다. 압축을 푼 .jar 파일을 보려면 JD-GUI (Java Decompiler)를 다운로드하십시오 . 그런 다음 .jar 파일을이 JD_GUI로 끌어다 놓으면 .java 파일과 같이 읽을 수있는 형식으로 .class 파일을 볼 수 있습니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력


이것은 우리가 .aar에서 .jar로 이름을 바꾸는 것만으로 AAR 파일을 JAR 파일처럼 사용할 수 있다는 것을 의미합니까?
— Soumya

@Soumya, 아니, 할 수 없습니다.
— ddmytrenko

2
사실 대화의 주제가 잘못되었습니다. AAR을 JAR로 또는 그 반대로 변환 할 수 없습니다. 우리가 할 수있는 유일한 일은 "AAR에서 JAR 추출"입니다. 그리고 여기에 두 줄의 Bash 코드를 사용하여이 작업을 자동으로 수행하는 방법을 썼습니다. stackoverflow.com/a/29252592/746529
— ddmytrenko

4

리소스 기반 .aar-projects

.aar 파일에서 classes.jar 파일을 찾는 것은 매우 간단합니다. 그러나 .aar-project가 일부 리소스 (예 : R.layout.xyz)를 정의한 경우 해당 접근 방식은 작동하지 않습니다.

  • 따라서 CommonsGuy의 deaar 는 .aar 파일 에서 유효한 ADT 친화적 인 프로젝트를 얻는 데 도움이되었습니다. 제 경우에는 subsampling-scale-image-view 변환했습니다 . 내 PC에 루비를 설치하는 데 약 한 시간이 걸렸습니다.

  • 또 다른 접근 방식은 CommonsGuy가 블로그에 쓴 것처럼 Eclipse / ADT 용 android-maven-plugin을 사용하는 것 입니다.

  • 또 다른 접근 방식은 원하는 전체 프로젝트를 git의 소스로 복제하고 "기존 Android 프로젝트"로 가져 오는 것입니다.


1

빌드에 Gradle을 사용하는 경우-java | kotlin | scala | ... 모듈에 aar 종속성을 추가 할 수있는 Gradle 플러그인이 있습니다.

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
}

이해하려고 노력하면 안드로이드 앱 / lib 플러그인에 대해 'compileOnlyAar'를 만들 수 있습니까? 나는 그것이 당신의 라이브러리에 관한 것이 아니라는 것을 알고 있지만 안드로이드 플러그인에는 'compileOnlyAar'와 같은 아티팩트 구성이 포함되어 있지 않기 때문에 가능하다는 것을 알고있을 것입니다. 여기에서이 기능이 필요한 이유를 이해할 수 있습니다 ( stackoverflow.com/questions/60998072/… )
— HeyAlex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.