การจัดการการพึ่งพาด้วย OSGi

ฉันต้องการพัฒนาแอปพลิเคชันหลายโมดูลตามข้อกำหนด OSGi สมมติว่าหนึ่งในโมดูลของฉันใช้ Apache Commons Logging 1.1.1 Spring มีเวอร์ชันรวมของ Apache Commons Logging 1.1.1 ในพื้นที่เก็บข้อมูล ดังนั้นฉันจึงเพิ่มการพึ่งพาที่เกี่ยวข้องใน POM ของฉันได้

ตัวอย่างเช่น หากฉันติดตั้งบันเดิลของฉันใน Apache Felix ถูกต้องหรือไม่ที่การขึ้นต่อกันของ Apache Commons Logging 1.1.1 จะไม่ได้รับการแก้ไขจนกว่าฉันจะติดตั้งบันเดิลของ Apache Commons Logging 1.1.1 ด้วย ชุดรวมของฉันจะพยายามนำเข้าแพ็คเกจที่ยังไม่ได้ส่งออก

ฉันไม่เข้าใจว่าการจัดการการพึ่งพาทำงานอย่างไรในโลก OSGi ฉันควรติดตั้งทุกบันเดิลที่แอปพลิเคชันของฉันต้องการหรือไม่ นอกจากนี้ฉันไม่เข้าใจว่ามันรวมเข้ากับ Maven ได้อย่างไร

ขอขอบคุณล่วงหน้าสำหรับคำอธิบายของคุณ


แก้ไข: ฉันเห็นว่ามีโปรเจ็กต์ย่อยของ Apache Felix ชื่อ OBR ซึ่งดูเหมือนว่าจะอำนวยความสะดวกในการจัดการบันเดิล (เช่น การปรับใช้) แต่เรามีสถาปัตยกรรม Maven พร้อมพื้นที่เก็บข้อมูลในเครื่อง พื้นที่เก็บข้อมูลส่วนตัวอยู่แล้ว... OBR จะรวมเข้ากับ Maven ได้อย่างไร


person Mickael Marrache    schedule 11.07.2012    source แหล่งที่มา


คำตอบ (2)


หากคุณต้องการใช้ OSGi ร่วมกับ maven ฉันขอแนะนำ Apache Karaf เป็นเซิร์ฟเวอร์ที่สามารถใช้เฟรมเวิร์ก Felix OSGi ได้ ข้อดีคือคุณสามารถติดตั้งบันเดิลได้โดยตรงจากที่เก็บ maven โดยใช้ mvn: urls

หากคุณเพียงใช้ Apache Karaf กับ maven repo คุณจะไม่มีการแก้ไขแบบสกรรมกริยาที่รันไทม์ คุณต้องติดตั้งบันเดิลทั้งหมดที่คุณต้องการ สิ่งที่ช่วยได้มากคือ karaf มีแนวคิดเรื่องฟีเจอร์ต่างๆ ดังนั้นคุณจึงสามารถใช้คุณสมบัติดังกล่าวเป็นโครงสร้างแบบเม็ดหยาบได้ คุณยังสามารถสร้างคุณสมบัติของคุณเองโดยอ้างถึงคุณสมบัติและบันเดิลอื่น ๆ ซึ่งช่วยให้สามารถติดตั้งแอปทั้งหมดของคุณด้วยคำสั่งเดียว

Felix และ Karaf รองรับ OBR เช่นกัน แต่คุณจะต้องสร้าง OBR Repo ของคุณเอง ขณะนี้ไม่มี repos OBR สาธารณะ ข้อดีของ OBR คือสามารถแก้ไขการพึ่งพาสกรรมกริยาส่วนใหญ่ได้ ฟีเจอร์ของ Karaf ยังทำงานร่วมกับ OBR ได้ ดังนั้นคุณจึงสามารถแสดงรายการบันเดิลระดับบนสุดในฟีเจอร์นั้นได้ และปล่อยให้ OBR แก้ไขส่วนที่เหลือ

ในทางปฏิบัติ ฉันมีประสบการณ์ที่ดีกับฟีเจอร์ Karaf แบบง่ายๆ ที่ไม่มี OBR เป็นการทำงานแบบแมนนวลแต่น้อยกว่าที่คุณคาดหวังและทำงานได้ค่อนข้างดี

person Christian Schneider    schedule 11.07.2012

การพึ่งพา OSGi ขึ้นอยู่กับแพ็คเกจ Java: เมื่อบันเดิลระบุว่าจำเป็นต้องนำเข้าแพ็คเกจที่กำหนด (ระบุช่วงของเวอร์ชันที่ยอมรับได้) เฟรมเวิร์กจะพยายาม "โยง" ที่อิมพอร์ตไปยังเวอร์ชันที่เหมาะสมของแพ็คเกจนั้น จะต้องส่งออกโดยกลุ่มอื่น

หากไม่พบแพ็คเกจ บันเดิลจะไม่ได้รับการแก้ไขและไม่สามารถเริ่มต้นได้ ดังนั้น ใช่ คุณจะต้องติดตั้งบันเดิลทั้งหมดที่แอปพลิเคชันของคุณต้องการ และตามที่ Christian ระบุว่ามีเครื่องมือมากมายที่สามารถช่วยคุณได้

วิธีง่ายๆ ในการรับบันเดิลที่ต้องการคือการใช้ maven-dependencies-plugin เพื่อดึงบันเดิลจากรายการการขึ้นต่อกันของ Maven และคัดลอกไปยังที่ที่แอปของคุณสามารถค้นหาได้เมื่อเริ่มต้นเพื่อติดตั้ง ดังที่ทำใน [2] (ใน launcher/pom.xml) ซึ่งเป็นแอปตัวอย่างเล็กๆ น้อยๆ ที่ฉันเขียน

คุณยังสามารถใช้ maven-launchpad-plugin [3] ของ Sling เพื่อสร้างไฟล์ jar ที่รันได้ซึ่งฝังเฟรมเวิร์ก OSGi และบันเดิลทั้งหมดที่คุณต้องการ และตั้งค่าทุกอย่างเมื่อเริ่มต้น

เกี่ยวกับการนำเข้าและส่งออก - โดยไม่ต้องลงรายละเอียด สมมติว่าคุณใช้ maven-bundle-plugin [1] เพื่อสร้างบันเดิลของคุณ คุณจะต้องระบุแพ็คเกจที่คุณต้องการให้บันเดิลของคุณส่งออก (แพ็คเกจอื่น ๆ จะมองไม่เห็นจากบันเดิลอื่น) และ maven-bundle-plugin จะสร้างรายการแพ็คเกจที่จะนำเข้า (ในกรณีส่วนใหญ่โดยอัตโนมัติ แต่คุณสามารถแทนที่ได้ตามต้องการ) ดังนั้นจึงมักจะทำงานไม่มากนักหากรหัสของคุณถูกแบ่งระหว่างแพ็คเกจที่คุณต้องการส่งออกอย่างหมดจด และแพ็คเกจการใช้งานภายใน

[1] http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html

[2] https://github.com/bdelacretaz/OSGi-for-mere-mortals< /ก>

[3] http://sling.apache.org/site/maven-launchpad-plugin.html

person Bertrand Delacretaz    schedule 12.07.2012