วิธีที่ดีที่สุดในการสร้างระบบปลั๊กอินด้วย Java


145

คุณจะใช้ระบบปลั๊กอินสำหรับแอปพลิเคชัน Java ของคุณอย่างไร?

เป็นไปได้หรือไม่ที่จะมีระบบที่ใช้งานง่าย (สำหรับผู้พัฒนา) ซึ่งประสบความสำเร็จดังต่อไปนี้:

  • ผู้ใช้ใส่ปลั๊กอินลงในไดเรกทอรีย่อยของแอพ
  • ปลั๊กอินสามารถให้หน้าจอการกำหนดค่า
  • หากคุณใช้กรอบงานสิทธิ์ใช้งานร่วมกันได้กับการพัฒนาเชิงพาณิชย์หรือไม่?

คำตอบ:


107

ก่อนอื่นคุณต้องมีส่วนต่อประสานที่ปลั๊กอินทั้งหมดต้องนำไปใช้เช่น

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

ผู้เขียนปลั๊กอินควรรวมปลั๊กอินไว้ในไฟล์ JAR แอปพลิเคชันของคุณเปิดไฟล์ JAR จากนั้นสามารถใช้แอตทริบิวต์จากรายการ JAR หรือรายการไฟล์ทั้งหมดในไฟล์ JAR เพื่อค้นหาคลาสที่ใช้อินเทอร์เฟซปลั๊กอินของคุณ ยกตัวอย่างคลาสนั้นปลั๊กอินพร้อมใช้งานแล้ว

แน่นอนคุณอาจต้องการใช้ sandboxing บางประเภทเพื่อให้ปลั๊กอินถูก จำกัด ในสิ่งที่ทำได้และไม่สามารถทำได้ ฉันได้สร้างแอปพลิเคชันทดสอบขนาดเล็ก(และblogged เกี่ยวกับมัน ) ที่ประกอบด้วยสองปลั๊กอินซึ่งหนึ่งในนั้นถูกปฏิเสธการเข้าถึงทรัพยากรท้องถิ่น


2
แซนด์บ็อกซ์ที่คุณพูดถึงเป็นส่วนที่ยากที่สุด! แต่ไม่ทำให้หงุดหงิด - osgi ทำเพื่อคุณตามที่ได้กล่าวมาแล้ว
Chii

1
Sandbox นั้นไม่ใช่เรื่องยาก พาฉันไปประมาณสองสัปดาห์เพื่อหาวิธีการทำอย่างถูกต้อง แต่เมื่อคุณรู้ว่ามันค่อนข้างง่าย :)
Bombe

@Bombe เป็นแอปพลิเคชั่นตัวอย่างนี้ที่ยังคงใช้งานได้ทุกที่หรือไม่
ataulm

* ใช้เอกสารแนบที่พบที่bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm

@ timberwo7ves ฉันไม่เข้าใจว่าคุณหมายถึงอะไร แอปพลิเคชันทดสอบไฟล์สามารถดาวน์โหลดได้จากตำแหน่งที่ระบุในโพสต์และจากหน้าที่คุณกล่าวถึง
Bombe

41

ใช้OSGi OSGi

มันเป็นรากฐานของระบบปลั๊กอิน Eclipse Equinoxเป็นการใช้งานของ Eclipse (ลิขสิทธิ์ EPL) และFelixเป็นการนำไปใช้ของโครงการ Apache (Apache License Public License)

Eclipse จัดเตรียมตัวอย่างที่ชัดเจนที่ OSGi สามารถครอบคลุมจุดที่คุณกล่าวถึง (หรือคุณสามารถสร้างแอปพลิเคชันของคุณบนEclipse RCP ได้หากคุณต้องการสแต็ก Eclipse / SWT / JFace แบบเต็ม)


4
ฉันได้ขลุกอยู่กับ OSGi แต่ไม่เคยพบไพรเมอร์ที่ดีจริงๆสำหรับมัน มันจะดีถ้ามีใครแนะนำลิงค์บางอย่างที่นี่
Brian Matthews

1
ฉันได้ฝัง Equinox ไว้ในแอปพลิเคชันของฉันและใช้แนวปฏิบัติ OSGi มาตรฐานเพื่อทำสิ่งที่ OP ต้องการ สวิงด้วยเช่นกันไม่ใช่ SWT เริ่มต้นด้วยเช่นกัน ทรัพยากรเริ่มต้นที่ดี: neilbartlett.name/blog
basszero

3
OSGi เป็นระบบปลั๊กอินในความเป็นจริง อย่างไรก็ตามการก้าวกระโดดจาก Java แบบมาตรฐานไปเป็นรูปแบบการเขียนโปรแกรม OSGi นั้นค่อนข้างกว้าง ...
Hendy Irawan

30

ตั้งแต่ 1.6 มีการjava.util.ServiceLoaderซึ่งสามารถใช้งานได้หากคุณต้องการรหัสระบบง่าย ๆ ของคุณเอง

แต่ถ้าคุณต้องการอะไรมากกว่าคุณสมบัติพื้นฐานให้ใช้หนึ่งในเฟรมเวิร์กที่มีอยู่


16

นอกจากนี้ยังมีJPF (Java ปลั๊กอินกรอบ)


มีใครที่นี่ใช้ JPF หรือไม่? ฟังดูน่าสนใจ
Sven Lilienthal

1
JabRef ใช้ JPF สำหรับปลั๊กอิน ทำงานได้ค่อนข้างดี
koppor

ฉันใช้ JPF แต่มันเชื่อมโยงกับ Ant อย่างแน่นหนา ฉันต้องการกำจัดมัน แต่ฉันไม่รู้ว่ามันจะมีผลกระทบกับใบสมัครของฉันมากแค่ไหน
MartinL

ฉันสร้างปลั๊กอิน JPF สำหรับผลิตภัณฑ์โอเพนซอร์ซ (OpenEMM); ฉันสามารถสร้างมันด้วย maven (ปลั๊กอินประกอบ maven); แน่นอนฉันขอขอบคุณความเรียบง่ายของการพัฒนาแม้ตอนนี้อาจเป็น OSGI ซึ่งเป็นที่นิยมมากขึ้น
рüффп

มีข้อ จำกัด ใด ๆ เกี่ยวกับรุ่น Java สำหรับการใช้ JPF หรือไม่?
Madhav

16

ใช้PF4J มีการรองรับ Web, Spring และ Wicket ใช้งานง่ายและสร้างแอพพลิเคชั่น


ฉันพบสิ่งนี้เป็นสิ่งที่ฉันต้องการและดูเหมือนจะค่อนข้างง่าย แต่ฉันต้องการความช่วยเหลือเกี่ยวกับมัน
nonybrighto

พยายามที่จะถามคำถามเพื่อหลอกลวงบน GitHub เขาจะช่วยคุณ
Daniel Jipa

ดูmeta.stackoverflow.com/questions/376686/…สำหรับสถานะบัญชี Decebals ที่นี่
Wolfgang Fahl

1
หากคุณกำลังดู pf4j คุณอาจดูgithub.com/hank-cp/sbpด้วย มันถูกสร้างขึ้นบน pf4j เพื่อรองรับ Spring Boot เพื่อสร้างเว็บแอปพลิเคชันที่สมบูรณ์
แฮงค์

13

ฉันทำงานกับ OSGi เป็นเวลาหนึ่งสัปดาห์ - ความเข้มข้นไม่มีอะไรนอกจาก OSGi สัปดาห์ ในตอนท้ายมันก็เหมือนฝันร้าย แต่ฉันได้เรียนรู้มากมาย

ฉันสามารถทำให้ OSGi ทำงานได้ (ไม่ใช่เรื่องง่ายตัวอย่างทั้งหมดล้าสมัยทุกอย่างในเน็ตมีอายุอย่างน้อยสามปีถ้าไม่ใช่ห้า) แต่ฉันมีปัญหาร้ายแรงในการรวมเข้ากับโครงการที่มีอยู่เนื่องจากปัญหาเกี่ยวกับ รายการขวด

ในระยะสั้นมีเพียงเครื่องมือที่คลุมเครือไม่กี่อย่างที่ใช้สำหรับสร้างอาคารและเอกสารเหล่านั้นไม่ได้รับการบันทึกไว้อย่างดี (เครื่องมือ BND นั้นแทบจะไม่คลุมเครือ แต่ได้รับการออกแบบสำหรับกระบวนการบางอย่างใน Eclipse) นอกจากนี้ข้อมูล OSGi ส่วนใหญ่ที่มีอยู่ไม่ได้ถูกกำหนดเป้าหมายไปยังนักพัฒนาแอปพลิเคชันที่มีแอปพลิเคชันเดสก์ท็อปที่มีอยู่

สิ่งนี้ทำให้บริบทมากมายสำหรับข้อมูลที่มีหมอกหรือไม่เหมาะสม การโพสต์บล็อกของ Neil Bartlett เป็นความช่วยเหลือที่ยิ่งใหญ่ที่สุด แต่ถึงแม้จะล้มเหลวในการรับระบบการทำงาน (ฉันคว้าโค้ดบางส่วนจากการกวดวิชาของเฟลิกซ์และรวมเข้าด้วยกันเพื่อทำให้เฟรมเวิร์กฝังตัว) ฉันพบฉบับร่างหนังสือของเขาที่เขาโพสต์เมื่อหลายปีก่อนซึ่งยอดเยี่ยม แต่ตัวอย่างใน Eclipse ไม่ทำงานเนื่องจากการเปลี่ยนแปลงในการสนับสนุน Eclipse OSGi

ทุกขั้นตอนเป็นสิ่งกีดขวางที่สำคัญ ฉันจะพยายามโพสต์รายละเอียดเพิ่มเติมที่นี่ในภายหลัง


17
นี่เป็นคำตอบอย่างไร เป็นเรื่องที่โวยวายเกี่ยวกับ OSGi มากกว่าและคุณไม่ได้อธิบายว่า OSGi คืออะไร
Stealth Rabbi

@StealthRabbi ในเวลานี้ "คำตอบ" และในบางครั้งหลังจากนั้นมันเป็นข้อมูลที่ดีสำหรับคนที่พยายามทำงานกับ OSGi ในป่า OSGi เป็นส่วนหนึ่งของการสนทนาอยู่แล้วดังนั้นจึงไม่จำเป็นต้องกำหนด มันเป็นคำตอบว่ามันอาจช่วยชีวิตผู้คนหนึ่งสัปดาห์ในการทำงาน - เหตุผลทั้งหมดของเรื่องนี้
Sean Anderson

9

ฉันคิดว่าการแนะนำ OSGi สำหรับการแก้ปัญหาที่ระบุข้างต้นนั้นเป็นคำแนะนำที่แย่มาก OSGi คือ "ตัวเลือกที่ถูกต้อง" แต่สำหรับสถานการณ์ตามที่กล่าวมาข้างต้นฉันคิดว่า JPF หรือกรอบการทำงานแบบเรียบง่ายแบบพื้นบ้านบางส่วนก็เพียงพอแล้ว


3

หลายปีก่อนฉันเริ่มโครงการเช่นนั้นและฉันหวังว่าเร็ว ๆ นี้จะพร้อมฉันได้รับแรงบันดาลใจจากโครงการเช่น NetBeans และ Eclipse แต่ในขณะเดียวกันมันก็เปลี่ยนเป็นบางสิ่งที่แตกต่างออกไปเล็กน้อย OSGi ดูเหมือนจะเป็นทางเลือกที่ดีในตอนนี้ แต่ฉันไม่มีโอกาสเปรียบเทียบกับโครงการของฉันมันคล้ายกับ JPF ที่กล่าวถึงข้างต้น แต่ในเวลาเดียวกันก็แตกต่างกันในหลาย ๆ ทาง

แนวคิดพื้นฐานที่กระตุ้นให้ฉันเป็นเรื่องง่ายที่สุดในการสร้างแอปพลิเคชัน Java โดยไม่ต้องแยกระหว่างแอปพลิเคชันเว็บแอปพลิเคชันเดสก์ท็อปหรือแอปเพล็ต / JWS (แน่นอนว่านี่ไม่ครอบคลุม UI -)

ฉันสร้างโครงการโดยมีเป้าหมายสองสามข้อในใจ:

  • ไม่สำคัญว่าคุณจะสร้างแอปพลิเคชั่นเว็บหรือเดสก์ท็อปแอพพลิเคชั่นคุณควรเริ่มต้นแอพพลิเคชั่นในลักษณะเดียวกันเป็นวิธีหลักธรรมดาไม่มีการประกาศ web.xml แฟนซี (ไม่ใช่ว่าฉันต่อต้านการมีเว็บ มันไม่ได้เป็นอย่างดีกับระบบปลั๊กอินที่คุณเพิ่ม "servlets" - ฉันเรียกพวกเขาว่า RequestHandler (s) - ไดนามิกตามที่คุณต้องการ
  • ง่ายต่อการเสียบ "ส่วนขยาย" รอบ ๆ "ส่วนขยายจุด" - บางสิ่งบางอย่างจาก Eclipse แต่วิธีการที่แตกต่างกัน
  • self-deployable เนื่องจากปลั๊กอินทั้งหมดได้รับการลงทะเบียน (ไฟล์ XML) แอปพลิเคชันจะต้องสามารถปรับใช้ได้เองโดยอิสระจากระบบการสร้าง - แน่นอนว่ามีภารกิจ Ant และ Maven MOJO ซึ่งเป็นลิงก์กับโลกภายนอกของเรา แต่ใน สิ้นสุดเรียกแอปพลิเคชันและสั่งให้ปรับใช้ตัวเองในสถานที่เฉพาะ
  • ที่ยืมมาจาก Maven สามารถดาวน์โหลดรหัสจากที่เก็บ (รวมถึงที่เก็บ Maven 1 & 2) เพื่อให้แอปพลิเคชันของคุณสามารถปรับใช้เป็น jar ขนาดเล็กเพียงครั้งเดียวตราบใดที่คุณมีการเข้าถึง repositories อัปเดต - คุณไม่ชอบความคิดที่จะได้รับการแจ้งเตือนจากแอปพลิเคชันบนเว็บของคุณว่ามีเวอร์ชันที่ใหม่กว่าดาวน์โหลดแล้วและคุณต้องได้รับอนุญาตจากคุณในการติดตั้งหรือไม่
  • การตรวจสอบแอปพลิเคชันขั้นพื้นฐานเกี่ยวกับสภาพของระบบการแจ้งเตือนทางอีเมลในกรณีที่เกิดความล้มเหลว

2
ฉันไม่ได้หมายความว่าจะจู้จี้ แต่คุณได้ทำงานกับมันตั้งแต่? มีรหัส (ฉันอาจใช้ตามที่เป็นอยู่หรือเพิ่มเข้าไป) ได้หรือไม่
Piccolo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.