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.