วิธีแปลง AAR เป็น JAR


93

สถานการณ์ :

ฉันตั้งใจจะใช้ไลบรารี Java และฉันมีแค่ไฟล์AARจากที่เก็บ Maven แต่ฉันต้องการไฟล์JAR

เรื่องราวความเป็นมา:

ฉันพยายามรวบรวมไลบรารี แต่โครงสร้าง Gradle ไม่เสถียร ดังนั้นฉันจึงขอไฟล์ jar ที่คอมไพล์แล้วและผู้พัฒนาก็ส่งไฟล์ aar จากที่เก็บ Maven มาให้ฉัน (นักพัฒนาไม่สามารถรวบรวมโปรเจ็กต์ของตัวเองได้) การกำหนดค่า Gradle นั้นยุ่งเหยิงขึ้นอยู่กับหลายไลบรารีและ Gradle ได้ทิ้งข้อยกเว้นบางประการ

ฉันพยายามใช้มันใน IDEA IDE ของฉัน แต่มันมองไม่เห็น โครงการห้องสมุดควรจะสามารถรวบรวมเป็นไฟล์ jar ได้ใช่ไหม?

คำถาม :

ฉันจะแปลงไฟล์ AAR เป็นไฟล์ JAR ได้อย่างไร


1
คุณสามารถเปลี่ยนชื่อกลับเป็น. jar ได้ แต่หากไม่ทราบรายละเอียดเพิ่มเติมเกี่ยวกับสภาพแวดล้อมของคุณสิ่งนี้อาจใช่หรือไม่ใช่สิ่งที่คุณต้องทำ AAR คือไลบรารีแกนที่มีการใช้งานเฉพาะ
— Pedantic

1
คุณจะหัวเราะ แต่ฉันต้องเพิ่มคำที่ไม่ปกติเพราะ SO จะไม่ปล่อยให้คำถามของฉันถูกโพสต์เพราะมันเป็นคำง่ายๆ และฉันเดาว่ามันบอกทุกอย่างว่านักพัฒนาของห้องสมุดไม่สามารถรวบรวมโครงการของตัวเองโดยใช้ Gradle ...
— Nestor

คำตอบ:


142

AARไฟล์ประกอบด้วยJARไฟล์และแฟ้มทรัพยากรบางอย่าง (มันเป็นพื้น zip ไฟล์มาตรฐานที่มีนามสกุลไฟล์ที่กำหนดเอง) ขั้นตอนในการแปลงมีดังนี้

  1. แตกไฟล์ AAR โดยใช้ไฟล์ zip มาตรฐาน (เปลี่ยนชื่อเป็น* .zipเพื่อให้ง่ายขึ้น)
  2. ค้นหาไฟล์class.jarในไฟล์ที่แยกออกมา
  3. เปลี่ยนชื่อตามที่คุณต้องการและใช้ไฟล์ jar ในโปรเจ็กต์ของคุณ

53
น่าสนใจที่คำตอบนี้ได้รับการยอมรับเพราะเพียงแค่เปลี่ยนชื่อ jar และคัดลอกไปยังไดเร็กทอรี libs ของโปรเจ็กต์ของคุณจะไม่ทำงานเนื่องจากไฟล์ทรัพยากรหายไปจาก jar
— ChuongPham

ทำตามบทช่วยสอนสำหรับ Spotify Android SDK คำตอบนี้คือวิธีแก้ไข เนื่องจากฉันพัฒนาโครงการใน Netbeans ซึ่งดูเหมือนว่าจะไม่สอดคล้องกับส่วนขยาย AAR คำพูดของ ChuongPham ดูเหมือนจะไม่เกี่ยวข้องกับคำตอบนี้ แต่เป็นคำตอบของ AWT และฉันก็เห็นด้วยบางส่วนกับ ChuongPham นั่นคือการเปลี่ยนชื่อแบบง่ายจาก AAR เป็น JAR ไม่ทำงาน อย่างไรก็ตามฉันไม่เห็นด้วยบางส่วนเนื่องจาก "ทรัพยากร" ไม่เกี่ยวข้องกับไฟล์ class.jar
— carl

11
ฉันมีช่วงเวลาที่ยากลำบากในการค้นหาวิธีแตกไฟล์บน mac ในกรณีที่คนอื่น ๆ ด้วย: เพียงแค่เปลี่ยน. aar เป็น. zip แล้วดับเบิลคลิก!
— Bastien Beurier

5
แล้วทางออกสำหรับการสร้าง jar ตามทรัพยากรคืออะไร?
— 2cupsOfTech

2
โซลูชันนี้แตกไฟล์ jar เท่านั้น แต่ไม่มีทรัพยากรอยู่ในนั้น จะมีบางอย่างผิดปกติ
— ทิงเกอร์อา

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 Files \ Java \ jdk1.7.0_25 \ bin>
— Nestor

1
เพื่อนขั้นที่ 1 ก็เพียงพอแล้ว เพียงแค่เปลี่ยนชื่อเป็น. jar ในมุมมองของฉันขั้นตอน (2) และ (3) ไม่มีประโยชน์
— ดร. ดีโอ

@DrDeo ถ้าฉันเพิ่งเปลี่ยนชื่อโปรเจ็กต์ eclipse จะไม่รับรู้ว่ามันเป็นไลบรารี เป็นเรื่องปกติ? เบาะแสใด ๆ ?
— Tanasis

1
หากคุณเพิ่งเปลี่ยนชื่อและไม่ได้บรรจุหีบห่อใหม่ด้วย jar จะไม่มีรายการและจะไม่รับรู้ว่าเป็นไฟล์ jar ที่ถูกต้องฉันเชื่อ
— AWT

16

อย่างที่หลาย ๆ คนชี้ให้เห็นการแตกไฟล์. jar ออกจากไฟล์. aar นั้นไม่ได้เป็นการตัดทอนเพราะทรัพยากรอาจขาดหายไป

นี่คือขั้นตอนที่ใช้ได้ผลสำหรับฉัน (บริบทของ Android ระยะทางของคุณอาจแตกต่างกันไปหากคุณมีวัตถุประสงค์อื่น):

  1. เปลี่ยนชื่อไฟล์. aar เป็น. zip และแตกไฟล์.
  2. โฟลเดอร์ที่แยกออกมาเป็นโปรเจ็กต์ ADT ที่คุณสามารถอิมพอร์ตใน Eclipse ด้วยการปรับเปลี่ยนเล็กน้อย (ดูด้านล่าง)!
  3. ในโฟลเดอร์ที่แยกแล้วให้เปลี่ยนชื่อไฟล์คลาสที่มีอยู่เป็นอะไรก็ได้ที่คุณต้องการ (ในตัวอย่างนี้ myProjectLib.jar) และย้ายไปยังโฟลเดอร์ lib ภายในโฟลเดอร์ที่แยกออกมา
  4. ตอนนี้เพื่อให้ Eclipse ยอมรับคุณต้องใส่สองไฟล์ลงในรูทโฟลเดอร์ที่แยกออกมา:
    • .โครงการ
    • .classpath
  5. ในการทำเช่นนั้นให้สร้างโครงการจำลอง Android ใหม่ใน Eclipse และคัดลอกไฟล์หรือคัดลอกจากโครงการ Android ที่มีอยู่
  6. เปิดไฟล์. project และค้นหาแท็กชื่อ XML และแทนที่เนื้อหาด้วย myProjectLib (หรืออะไรก็ตามที่คุณเรียกว่าไฟล์ jar ของคุณด้านบน) และบันทึก
  7. ตอนนี้ใน Eclipse คุณสามารถFile -> New -> Project -> Android Project จากซอร์สที่มีอยู่ ..และชี้ไปที่เนื้อหาโฟลเดอร์ที่แยกออกมา
  8. หลังจากนำเข้าคลิกขวาที่โครงการที่สร้างขึ้นใหม่ให้เลือกProperties -> Androidและเช็คห้องสมุด
  9. ในโปรเจ็กต์หลักของคุณที่คุณต้องการใช้ไลบรารีให้ไปที่Properties -> Androidและเพิ่ม myProjectLib ที่เพิ่งเพิ่มเข้าไปในรายการการอ้างอิง

สิ่งนี้ช่วยฉันได้ แต่เพื่อให้ทำงานได้เต็มที่ฉันต้องสร้างโฟลเดอร์ "src" ว่างระหว่างขั้นตอนที่ 6 และ 7
— Bernhard Krenz

8

สำหรับผู้ที่ต้องการทำโดยอัตโนมัติฉันได้เขียนสคริปต์ทุบตีสองบรรทัดเล็กน้อยซึ่งทำสองสิ่งถัดไป:

  1. ค้นหาไฟล์ * .aar ทั้งหมดและแยก class.jar ออกจากไฟล์
  2. เปลี่ยนชื่อ class.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. คลิกขวาที่ "class.jar" ตามที่แสดงในการจับภาพด้านล่างแล้วคลิก "แสดงใน explorer" นี่คือ. jar ของคุณ

เข้าถึง. jar จาก. aar


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.

หมายเหตุ: หากคุณต้องการรับเฉพาะไฟล์. jar จากไฟล์. aar ของคุณให้ใช้วิธีการข้างต้น สมมติว่าหากคุณต้องการรวม manifest.xml และทรัพยากรในไฟล์. jar ของคุณหมายความว่าคุณสามารถคลิกขวาที่ไฟล์. aar ของคุณและบันทึกเป็นไฟล์. jar ได้โดยตรงแทนที่จะบันทึกเป็น. zip เพื่อดูไฟล์ขวดที่คุณได้สกัดดาวน์โหลด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-projects

การค้นหาไฟล์ class.jar ภายในไฟล์. aar นั้นค่อนข้างไม่สำคัญ อย่างไรก็ตามวิธีการดังกล่าวไม่ได้ผลหาก. ar-project กำหนดทรัพยากรบางอย่าง (ตัวอย่าง: R.layout.xyz)

  • ดังนั้นdeaarจาก CommonsGuy จึงช่วยให้ฉันได้รับโครงการที่เป็นมิตรกับ ADT ที่ถูกต้องจากไฟล์. aar ในกรณีของฉันฉันแปลง subsampling ขนาดภาพมุมมอง ฉันใช้เวลาประมาณหนึ่งชั่วโมงในการตั้งค่า Ruby บนพีซีของฉัน

  • อีกวิธีหนึ่งคือการใช้หุ่นยนต์ 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 app / lib ฉันรู้ว่ามันไม่เกี่ยวกับไลบรารีของคุณ แต่บางทีคุณอาจจะรู้ว่ามันเป็นไปได้เนื่องจากปลั๊กอิน Android ไม่มีการกำหนดค่าสิ่งประดิษฐ์เช่น 'compileOnlyAar' คุณสามารถเข้าใจว่าทำไมฉันถึงต้องการฟังก์ชันนี้ที่นี่ ( stackoverflow.com/questions/60998072/… )
— HeyAlex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.