วิธีสร้าง. jar จากโปรเจ็กต์ Android Studio


98

ฉันใช้ AndroidStudio และมีโปรเจ็กต์นี้ดังที่แสดง:

ป้อนคำอธิบายภาพที่นี่

สิ่งที่อยู่ในวงกลมสีน้ำเงินคือ myLib myLib ยังต้องใช้ lib ภายนอกที่อยู่ในวงกลมสีแดงและแพ็คเกจ apache (วงกลมสีเขียว)

ดังนั้นฉันต้องการทำให้สิ่งนี้กลายเป็น. jar เดียวเพื่อที่ฉันจะได้ใช้ในโปรเจ็กต์อื่น

คำแนะนำทีละขั้นตอนจะได้รับการชื่นชมมากฉันเป็นมือใหม่ในโลกของนักพัฒนาซอฟต์แวร์

ขอบคุณ!


1
ฉันคิดว่าสิ่งที่คุณต้องการคือไฟล์ aar (ไฟล์เก็บถาวรของ Android) ที่สามารถเชื่อมโยงอย่างเงียบ ๆ ง่ายๆเป็นการพึ่งพา โดยทั่วไปคุณต้องสร้างโครงการไลบรารี Android แต่ฉันไม่สามารถเขียนขั้นตอนที่แน่นอนจากใจได้
rekire

2
ฉันต้องการไฟล์. jar เพื่อที่จะใช้ในโปรเจ็กต์ java ใดก็ได้ ไม่เพียง แต่ Android เท่านั้น
dum4ll3

1
ต้องเกือบเหมือนกัน - สร้างโครงการห้องสมุดและส่งออก
Thrash Bean

ข้อผิดพลาดนี้อธิบายถึงข้อบกพร่องในปลั๊กอิน Android gradle ที่ป้องกันไม่ให้แฮ็กไฟล์ gradle buildfile เพื่อเพิ่มเป้าหมาย jar ได้อย่างง่ายดาย ...
mmigdol

คำตอบ:


136
  • เปิด build.gradle สำหรับโปรเจ็กต์ไลบรารี ป้อนคำอธิบายภาพที่นี่

  • เขียนสองงานใน build.gradle - deleteJar และ createJar และเพิ่มกฎ createJar.dependsOn (deleteJar, build) ป้อนคำอธิบายภาพที่นี่

รหัสจากด้านบน:

task deleteJar(type: Delete) {
    delete 'libs/jars/logmanagementlib.jar'
}           

task createJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('libs/jars/')
    include('classes.jar')
    rename('classes.jar', 'logmanagementlib.jar')
}

createJar.dependsOn(deleteJar, build)
  • ขยายแผงไล่ระดับจากด้านขวาและเปิดงานทั้งหมดภายใต้ yourlibrary-> อื่น ๆ คุณจะเห็นสองงานใหม่ที่นั่น - createJar และ deleteJar ป้อนคำอธิบายภาพที่นี่

  • ดับเบิลคลิกที่ createJar ป้อนคำอธิบายภาพที่นี่

  • เมื่องานรันสำเร็จรับ jar ที่สร้างขึ้นจากพา ธ ที่กล่าวถึงในงาน createJar เช่น libs / xxxx.jar ป้อนคำอธิบายภาพที่นี่

  • คัดลอก jar ที่สร้างขึ้นใหม่ลงในโฟลเดอร์ lib ของโปรเจ็กต์ที่คุณต้องการ -> คลิกขวา -> เลือก "เพิ่มเป็นไลบรารี"


4
บางครั้งคนเราเข้าใจด้วยการดูมากกว่าอ่าน เป็น UX ที่ดีที่คุณเห็น☺
Abhinav Tyagi

5
releaseอืมแล้วผมควรจะบอกคุณว่าผมไม่แน่ใจว่าเกี่ยวกับ ฉันมีdebugและdefaultแต่ไม่มีreleaseโฟลเดอร์ คุณใช้ปลั๊กอินเวอร์ชันใด คุณทราบหรือไม่ว่าเอกสารนี้ได้รับการบันทึกไว้ที่ใด
Cameron Lowell Palmer

3
ฉันไม่มีreleaseโฟลเดอร์
Kamran Bigdely

4
พยายามลอกอะไร ?? เราควรกำหนดเป้าหมายโฟลเดอร์ที่มีไฟล์ APK หรือไม่? ฉันหมายถึงในบรรทัดจาก ('build / intermediates / bundles / default') สิ่งที่ไดเร็กทอรีนี้ถือไว้สำหรับคุณ ไม่มีโฟลเดอร์ในสตูดิโอ Android ของฉันที่มีชุดชื่อและฉันไม่ได้รับแหล่งที่มาในงาน
createJar

12
เปลี่ยนจาก ('build / intermediates / bundles / release /') เป็นจาก ('build / intermediates / packaged-class / release /') สำหรับ Android Studio 3.1.3 และ Gradle เวอร์ชัน 4.4
Vaishakh

60

หากคุณตั้งค่าโค้ดเป็นโมดูล Java ธรรมดาใน Gradle การให้ Gradle ให้ไฟล์ jar ที่มีเนื้อหาเป็นเรื่องง่าย ไฟล์ jar นั้นจะมีเฉพาะรหัสของคุณไม่ใช่ไลบรารี Apache อื่น ๆ ที่ขึ้นอยู่กับ ฉันขอแนะนำให้แจกจ่ายด้วยวิธีนี้ เป็นเรื่องแปลกเล็กน้อยที่จะรวมกลุ่มการอ้างอิงไว้ในไลบรารีของคุณและเป็นเรื่องปกติมากขึ้นสำหรับผู้ใช้ไลบรารีเหล่านั้นที่จะต้องรวมการอ้างอิงเหล่านั้นด้วยตัวเอง (เพราะมิฉะนั้นการชนกันของโปรเจ็กต์เหล่านั้นกำลังเชื่อมโยงสำเนาของไลบรารีอยู่แล้วอาจเป็นเวอร์ชันที่แตกต่างกัน ). ยิ่งไปกว่านั้นคุณหลีกเลี่ยงปัญหาการออกใบอนุญาตที่อาจเกิดขึ้นเกี่ยวกับการแจกจ่ายรหัสของผู้อื่นหากคุณต้องการเผยแพร่ห้องสมุดของคุณ

นำโค้ดที่ต้องคอมไพล์ไปยัง jar และย้ายไปยังโมดูล Java ธรรมดาแยกต่างหากใน Android Studio:

  1. เมนูไฟล์ > โมดูลใหม่ ... > ไลบรารี Java
  2. ตั้งค่าไลบรารีชื่อแพ็กเกจ Java และชื่อคลาสในวิซาร์ด (หากคุณไม่ต้องการให้สร้างคลาสสำหรับคุณคุณสามารถลบได้เมื่อสร้างโมดูลแล้ว)
  3. ในโค้ด Android ของคุณตั้งค่าการพึ่งพาโมดูลใหม่เพื่อให้สามารถใช้โค้ดในไลบรารีใหม่ของคุณ:
  4. ไฟล์ > โครงสร้างโครงการ > โมดูล > (Android โมดูลของคุณ) > อ้างอิง > + > โมดูลการพึ่งพา ดูภาพหน้าจอด้านล่าง: ป้อนคำอธิบายภาพที่นี่
  5. เลือกโมดูลของคุณจากรายการในกล่องโต้ตอบที่ปรากฏขึ้น: ป้อนคำอธิบายภาพที่นี่

หวังว่าโครงการของคุณควรจะสร้างได้ตามปกติในตอนนี้ หลังจากที่คุณสร้างบิวด์ไฟล์ jar สำหรับไลบรารี Java ของคุณจะถูกวางไว้ในไดเร็กทอรีbuild / libsในไดเร็กทอรีโมดูลของคุณ หากคุณต้องการสร้างไฟล์ jar ด้วยมือคุณสามารถรันงานไฟล์jar build จากหน้าต่าง Gradle: ป้อนคำอธิบายภาพที่นี่


ขอบคุณมาก! คำตอบของคุณมีประโยชน์มากที่สุดในภาพหน้าจอสุดท้ายที่แสดงงาน Gradle ฉันไม่รู้เรื่องนั้น ฉันสามารถทำตามขั้นตอนของคุณได้ แต่ฉันยังไม่มี org.apache.http.Header ฉันจะนำเข้าสู่ lib ของฉันได้อย่างไร
dum4ll3

คุณหมายความว่าอย่างไรเมื่อคุณบอกว่าคุณพลาด
Scott Barta

1
ทำตามขั้นตอนโครงสร้างโครงการ> การอ้างอิงเดียวกัน แต่เลือกโมดูลไลบรารีของคุณแทนโครงการของคุณและเพิ่มการอ้างอิงในลักษณะเดียวกัน ในคำตอบของฉันฉันบอกว่ามันวางไฟล์ jar ไว้ใน build / libs dir ในไดเร็กทอรีโมดูล
Scott Barta

1
ฉันได้รับ: java.lang.NoClassDefFoundError: com.loopj.android.http.RequestParams นั่นคือห้องสมุดภายนอกของฉันที่ฉันกำลังรวบรวมกับของฉัน
dum4ll3

2
ใช้งานได้กับไลบรารี java เท่านั้นและไม่มีงาน jar ในไลบรารี Android
cuasodayleo

28

ใน Android Studio IDE ให้เข้าไปที่ " Run Anything bar " โดย:

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

หลังจากนั้นคุณจะพบสิ่งประดิษฐ์ของคุณในโฟลเดอร์นี้ในโครงการของคุณ
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


หรือ


Gradle มีอยู่แล้วTaskในเมนูด้านข้างของ gradle ใต้otherโฟลเดอร์

แถบเครื่องมือไล่ระดับ

จากนั้นเลื่อนลงไปcreateFullJarReleaseและคลิก

งาน Gradle

หลังจากนั้นคุณจะพบสิ่งประดิษฐ์ของคุณในโฟลเดอร์นี้ในโครงการของคุณ

Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


2
ไม่เห็นตัวเลือกนี้ มีการเพิ่มสิ่งนี้ใน Studio เวอร์ชันล่าสุดหรือไม่
Dibzmania

1
ฉันสร้างและเมื่อค้นหา * .jar มันคือชื่อ: full.jar 30 นาทีเจอแล้ว lol
nobjta_9x_tq

1
ในกรณีของฉันฉันพบมันในbuild\intermediates\intermediate-jars\release
Yusril Maulidan Raji

ผมมีคำถาม. ในกรณีของฉันมันสร้างไฟล์ jar 3 ไฟล์ classes.jar, full.jarและres.jar. ฉันควรนำเข้าไฟล์ jar ทั้งหมดทุกครั้งที่ต้องการใช้หรือไม่?
Yusril Maulidan Raji

เพียงใช้ full.jar
Haroun Hajem

11

เพียงเพิ่มสิ่งนี้ใน build.gradle ของโมดูล java ของคุณ จะรวมไลบรารีที่ขึ้นอยู่กับที่เก็บถาวร

mainClassName = "com.company.application.Main"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

ซึ่งจะส่งผลให้ไฟล์ [module_name] / build / libs / [module_name] .jar


แต่ห้องสมุด. jar จะมีคลาสหลักหรือไม่? OP บอกว่าพวกเขากำลังสร้างไฟล์. jar "เพื่อที่ฉันจะได้ใช้ในโปรเจ็กต์อื่น" (sic) ฟังดูเหมือนห้องสมุด
Steve White

มีเพียงผู้ชายคนนี้เท่านั้นที่เข้าใจสิ่งนั้นจริงๆแค่การสร้างขวดไม่สามารถแก้ปัญหาความผิดปกติได้ จะเป็นอย่างไรหากเราต้องการดำเนินการ โค้ดด้านบนหลีกเลี่ยงข้อผิดพลาด "ไม่สามารถเรียกใช้ไฟล์ jar-:" ไม่มีแอตทริบิวต์รายการหลัก ""
MobileEvangelist

1

ไฟล์. jar จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณคอมไพล์ / เรียกใช้แอปพลิเคชันของคุณ

คุณสามารถค้นหาไฟล์ class.jar ของคุณได้จาก root_folder / app / build / intermediates / bundle / debug

ตำแหน่งไฟล์ jar


1
  1. ไปที่แท็บ Gradle ใน Android Studio จากนั้นเลือกโครงการไลบรารี

  2. จากนั้นไปที่ Tasks

  3. จากนั้นไปที่อื่น ๆ

  4. ดับเบิลคลิกที่ bundleReleaseaar

คุณสามารถค้นหา.aarไฟล์ของคุณภายใต้your_module/build/outputs/aar/your-release.aar

นี่ภาพ


ฉันไม่เห็น "Gradle Tab" ที่ใดเลย ในที่สุดฉันก็พิมพ์คำว่า "Gradle" ในการค้นหา Help และได้รับสิ่งที่คล้ายกับมุมมอง Gradle ของคุณ แต่รายการข้างในนั้นแตกต่างกันมากสั้นกว่าของคุณมาก ไม่มี BundleReleaseaar ภายใต้ Tasks-> Other มี "createJar" แต่เมื่อฉันคลิกที่ฉันได้รับ "Task" createJar "ไม่พบในรูทโปรเจ็กต์ ... " ฉันติดขัด และ ... ทำไมเราถึงต้องการไฟล์. aar? OP ขอไฟล์. jar นั่นคือสิ่งเดียวกัน>
Steve White

แต่คำถามคือวิธีที่จะทำให้.jarไม่ได้.aar
Aleksey Timoshchenko

0

วิธีที่ฉันพบคือการค้นหาผลลัพธ์ของคอมไพเลอร์โครงการ (โครงสร้างโครงการ> โครงการ) จากนั้นค้นหาโฟลเดอร์ที่สอดคล้องกันของโมดูลที่คุณต้องการเปลี่ยนเป็น jar บีบอัดด้วย zip และเปลี่ยนส่วนขยายของเอาต์พุตจาก zip เป็น jar


0
task deleteJar(type: Delete) {
    delete 'libs/mylibrary.jar'
}           

task exportjar(type: Copy) {
    from('build/intermediates/compile_library_classes/release/')
    into('libs/')
    include('classes.jar')
    rename('classes.jar', 'mylibrary.jar')
}

exportjar.dependsOn(deleteJar, build)

0

หากคุณเรียกใช้งาน gradle จาก AndroidStudio [เพิ่มเติม]

assembleRelease 
//or
bundleReleaseAar

หรือผ่านเทอร์มินัล

./gradlew <moduleName>:assembleRelease
//or
./gradlew <moduleName>:bundleReleaseAar

จากนั้นคุณจะพบ.aarใน

<project_path>/build/outputs/aar/<module_name>.aar
//if you do not see it try to remove this folder and repeat the command

.aarไฟล์ (Android Library) ประกอบด้วยไฟล์.jar(Java Library) และทรัพยากร Android เพิ่มเติม .aarไฟล์ zip ไฟล์ที่มีนามสกุล AAR นั่นคือเหตุผลที่คุณสามารถแทนที่.aarด้วย.zipหรือวิ่ง

unzip "<path_to/module_name>.aar"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.