วิธีแปลง 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.