1
ʲôÊÇÄ£¿é»¯
Ä£¿é²ãÊÇOSGi¿ò¼ÜÖÐ×î»ù´¡µÄÒ»²¿·Ö£¬ÆäÖÐJavaµÄÄ£¿é»¯ÌØÐÔÔÚÕâÒ»²ãµÃµ½Á˺ܺõÄʵÏÖ¡£µ«ÊÇÕâÖÖʵÏÖÓëJava±¾ÉíÏÖÓеÄһЩģ¿é»¯ÌØÐÔÓÖÓÐÃ÷ÏԵIJ»Í¬¡£
±¾ÎĽéÉÜÄ£¿é²ãµÄһЩ»ù´¡ÖªÊ¶£¬ÒÔ¼°OSGiÁªÃËÔÚÉè¼ÆÄ£¿é²ãʱËù×öµÄһЩ¿¼ÂÇ¡£OSGi±ê×¼×ßµ½½ñÌ죬²¢²»ÊÇÆ¾¿ÕÏë³öÀ´µÄ£¬ËüµÄ²úÉúǡǡÊÇΪÁËÃÖ²¹Ö®Ç°Ò»Ð©¼¼ÊõµÄȱÏÝ¡£
Ä£¿é»¯Æäʵ¾ÍÊǼÆËã»ú¿ÆÑ§Öг£¼ûµÄÒ»¸ö¸ÅÄ ¡°½«Ò»¸ö´óÐÍϵͳ·Ö½âΪ¶à¸ö½ÏСµÄ»¥ÏàÐ×÷µÄÂß¼µ¥Ôª£¬Í¨¹ýÇ¿ÖÆÉ趨ģ¿éÖ®¼äµÄÂß¼±ß½çÀ´¸ÄÉÆÏµÍ³µÄά»¤ÐԺͷâ×°ÐÔ¡±¡£
ÔÚOSGiÖÐÄ£¿éµÄ¶¨Òå¿ÉÒԲο¼ÏÂͼ£º

Ò²¾ÍÊÇ˵һ¸öÄ£¿é£¨module£©¶¨ÒåÁËÒ»¸öÂß¼±ß½ç£¬ÕâÖÖÄ£¿é±¾Éí¾«È·µÄ¿ØÖÆÁËÄÄЩÀàÊÇÍêÈ«±»·â×°ÆðÀ´µÄ£¬¶øÄÄЩÀàÐèÒª±©Â¶³öÀ´×÷ΪÍⲿʹÓá£ÕâÑùÎÒÃǾͿÉÒÔÇáËɵĽ«ÊµÏÖÆÁ±ÎÔÚÄ£¿éµÄÄÚ²¿£¬¶ø½«¹«¹²API±©Â¶ÔÚÍⲿ¡£
2 ΪʲôÐèҪģ¿é»¯
2.1 OSGiÖÐÄ£¿é»¯ÓëÃæÏò¶ÔÏóµÄÁªÏµÓëÇø±ð
°´ÕÕÒÔÉÏÄ£¿é»¯µÄ¶¨Ò壬¿ÉÄÜÓеÄÈË»áÎÊ£º¡°ÔÚÃæÏò¶ÔÏóÀïÃæ£¬²»ÊÇÒ²ÓжÔÄ£¿é»¯µÄÖ§³ÖÂ𣿡±Ã»´í£¬ÃæÏò¶ÔÏóµÄ¸ÅÄî¿ÉÒÔ˵ҲÔÚÒ»¶¨³Ì¶ÈÉÏÖ§³ÖÄ£¿é»¯±à³Ì£¬ÄÇΪʲô»¹ÐèÒªOSGiÌṩµÄÄ£¿é»¯ÌØÐÔÄØ£¿ÕâÉæ¼°µ½¡°Âß¼±ß½ç¡±µÄ²»Í¬Á£¶È¡£
ÔÚÓÃJava±àÐ´ÃæÏò¶ÔÏó³ÌÐòµÄʱºò£¬Ò»¸öÁ˽âÃæÏò¶ÔÏó¸ÅÄîµÄÈËÊDz»»á°ÑËùÓй¦Äܶ¼Èûµ½Í¬Ò»¸öÀàÀïÃæÈ¥µÄ£¬ÃæÏò¶ÔÏóÈÃÄã´ÓÎÊÌâÓòÖз¢ÏÖ¶à¸öÊÂÎ²¢ÇÒÿ¸öÊÂÎ︺Ôð²»Í¬µÄ¹¦ÄÜ£¬¾¡Á¿×öµ½¸ßÄھۺ͵ÍñîºÏ¡£ÔÚÕâÀÎÒÃÇ¿ÉÒÔËµÃæÏò¶ÔÏóµÄÄ£¿é»¯Á£¶ÈÊÇÔÚ¡°ÀࡱÕâ¸ö¼¶±ðÉÏ¡£
¶øOSGiµÄÄ£¿é»¯£¬ÔòÊÇͨ¹ýΪJAR°üÌí¼ÓmetadataÀ´¶¨ÒåÄÄЩÀàÓ¦¸Ã±©Â¶ÄÄЩÀàÓÖÒþ²ØÔÚ°üÖУ¬Æä¿ØÖƿɼûÐÔµÄÁ£¶ÈÊÇÔÚbundle£¨JAR°ü£©ÕâÒ»²ãÃæÉϵġ£
ËùÒÔ£¬ËüÃÇËù´øÀ´µÄÄÜÁ¦¶¼ÊÇͨ¹ý¿ØÖƿɼûÐԺͿÉÓÃÐÔÀ´±£Ö¤¸ßÄھۺ͵ÍñîºÏµÄ£¬µ«ÊÇÁ£¶È²»Í¬£¬Ò»¸öÊǶÔÏó²ãÃæÉϵģ¬Ò»¸öÊÇÄ£¿é²ãÃæÉϵġ£
¼ÈÈ»¸ºÔðµÄÊDz»Í¬µÄÁ£¶È£¬ÄÇôÁ½Õß²¢²»Ï໥³åÍ»£¬¸÷Óи÷µÄ×÷ÓÃÔÚÀïÃæ¡£
2.2 JavaÔÚÄ£¿é»¯·½ÃæµÄ¾ÖÏÞÐÔ
2.2.1 µ×²ã´úÂë¿É¼ûÐÔ¿ØÖÆ
JavaÌṩÁËprivate£¬public£¬protectedºÍpackage
private£¨ÎÞÐÞÊηû£©ÕâËÄÖÖ·ÃÎÊ¿ØÖƼ¶±ð£¬²»¹ýÕâ½ö½öÌṩÁ˵ײãµÄOOÊý¾Ý·â×°ÌØÐÔ¡£°üÕâ¸ö¸ÅÄîȷʵÊÇÆðµ½ÁË·Ö¸î´úÂëµÄ×÷Ó㬵«ÊÇÈç¹û°üÖеĴúÂëÐèÒª¶Ô°üÍâ¿É¼û£¬ÄÇô±ØÐëÉèÖÃΪpublic£¨»òÕßprotected£¬Èç¹ûÊÇʹÓÃÁ˼̳еϰ£©¡£
ÕâÑùµÄ»°¾Í¿ÉÄܳöÏÖÒ»¸öÎÊÌ⣺
Ê×ÏÈ´ó¼Ò¿´¿´ÏÂÃæµÄÀý×Ó£¬ÆäÖÐÓÐÈý¸öjavaÎļþ£º
org.serc.helloworld.Hello.java£º¶¨ÒåÁËÒ»¸ö½Ó¿Ú
package org.serc.helloworld;
public interface Hello {
void sayHello();
}
|
org.serc.helloworld.impl.HelloImpl.java£ºÊµÏÖÁËHello½Ó¿Ú
package org.serc.helloworld.impl;
import org.serc.helloworld.Hello;
public class HelloImpl implements Hello{
final String helloString;
public HelloImpl(String helloString){
this.helloString = helloString;
}
public void sayHello(){
System.out.println(this.helloString);
}
}
org.serc.helloworld.main.Main.java
package org.serc.helloworld.main;
import org.serc.helloworld.Hello;
import org.serc.helloworld.HelloImpl;
public class Main{
final String helloString;
public static void main(String[] args){
Hello hello = new HelloImpl(¡°Hello,SERC!¡±);
hello.sayHello();
}
|
ÕâÈý¸öÎļþ·Ö±ðÔÚ²»Í¬µÄ°üÖС£°´Àí˵£¬HelloImplÕâ¸öʵÏÖϸ½ÚÊDz»Ó¦¸Ã±©Â¶¸øÆäËû°üµÄ£¬µ«ÊÇ´ÓMain.javaµÄmain·½·¨ÖÐÎÒÃÇ¿ÉÒÔÃ÷ÏԵĿ´³ö£¬ÎªÁË´´½¨Hello
µÄʵÀý£¬ÎÒÃDz»µÃ²»ÒýÈëHelloImplÀ࣬µ«ÊÇHelloImpl×÷Ϊ½Ó¿ÚµÄʵÏÖϸ½Ú£¬ÊDz»Ó¦¸Ã±©Â¶¸øÊ¹ÓÃÕߵģ¬ÕâÎ¥·´ÁË·â×°µÄÔÔò£¬ÏÔÈ»²»Ì«ºÃ¡£
µ«ÊÇ£¬Èç¹ûÎÒÃDz»ÏëÈÃHelloImpl±©Â¶³öÀ´µÄ»°£¬¾ÍÐèÒª×ö¶îÍâµÄ¹¤×÷À´±£Ö¤¡°¼ÈÒþ²ØÁËʵÏÖϸ½Ú£¬ÓÖÄܼòµ¥µÄ´´½¨Ò»¸öʵÏÖÁËHello½Ó¿ÚµÄʵÀý¡±¡£´ïµ½ÕâһĿµÄµÄ·½·¨²»Ö¹Ò»ÖÖ£¨±ÈÈ繤³§Ä£Ê½£©£¬ÓÐЩÖÁ½ñÒ²ÊǺܳ£Óõ쬵«ÊÇÕâÔö¼ÓÁËÓëÓ¦Óñ¾Éí¹¦ÄÜÎ޹صĶàÓ๤×÷£¬ÏëÏëÈç¹ûÄãÿ´ÎÏ뿪·¢Ò»¸öÓ¦Óö¼ÒªÎªÁË´ïµ½ÉÏÊöÄ¿µÄ¶ø×ö³ö¶àÓ๤×÷£¬²»µÃ²»ËµÊÇÓе㷱ËöµÄ£¬ËùÒÔÕâ¿ÉÒÔ˵ÊÇJavaµÄÒ»´ó¾ÖÏÞ¡£
2.2.2 classpathµÄ¾ÖÏÞ
ÎÒÃÇÔÚclasspathÖмÓÈëjar°üµÄʱºò£¬Ö»ÊǼòµ¥µÄ¸ø³öÎļþ·¾¶£¬¶øÕâ¸öjar°üµÄ°æ±¾ºÍÒ»ÖÂÐÔ£¬ËüËùÒÀÀµµÄjar°üÊÇʲô£¬ÎÒÃǶ¼ÎÞ·¨ÔÚclasspathÖÐÃ÷È·µÄÉèÖûòÊÇ´ÓclasspathÖп´³öÕâЩÊôÐÔ¡£
²¢ÇÒclasspathÖеÄjar°üÊǰ´Ðò¼ÓÔØµÄ£¬ÀýÈ磺
classpath£½c:\servlet2.2\servlet.jar£»c:\servlet2.3\servlet.jar£¬ |
ÄÇôÔÚʵ¼ÊÓ¦ÓõĹý³ÌÖУ¬JavaÈÃÄãʹÓõÄÊÇservlet2.2£¬¶ø²»ÊÇservlet2.3¡£ÕâÖÖÇé¿öÏÂÎÒÃÇ»¹ÄÜ¿´³öÀ´Ê¹ÓõÄÊÇÄĸö°æ±¾£¬Èç¹ûÔÚ´óÐÍϵͳÖдó¼Ò·Ö¿ª¿ª·¢µÄʱºò¸÷Óø÷µÄservlet°ü£¬²¢ÇÒ°æ±¾ºÅ²»Ò»Ñù£¬ÄÇôÔÚ×îºó½«¿ª·¢½á¹ûºÏ²¢µÄʱºò£¬µ½Ê±ºòÓõÄÊÇÄĸö°æ±¾µÄservlet°ü¾ÍºÜÄѸãÇå³þÁË£¬Ò²¾Í˵²»¿É¿ØÐÔÊDZȽÏÇ¿µÄ¡£
¼´Ê¹classpathÄÜ×¢Òâµ½°æ±¾µÄÎÊÌ⣬Ҳû·¨¾«È·Ö¸³öÒÀÀµ¡£ÊÔ×Å»ØÏëÄãÔÚÉèÖÃclasspathµÄ¹ý³ÌÖгöÏÖ¹ýÇé¿ö£ºÔÚÄãÒÔΪclasspathÒѾÉèÖÃÍê±ÏÒÔºó£¬Äã³¢ÊÔÆô¶¯³ÌÐò£¬½á¹ûÐéÄâ»úÅ׳öÒì³£¸æËßÄãȱ°ü£¬È»ºóÄãÔÙ¼ÓÉÏÄã¾õµÃȱÉÙµÄÄÇЩ°ü£¬È»ºóÔÙÆô¶¯³ÌÐò£¬Èç´Ë·´¸´Ö±µ½ÐéÄâ»ú²»ÔËÐе½È±°üÒ쳣Ϊֹ¡£
2.3 OSGi¶ÔÕâЩ¾ÖÏÞÐԵĸÄÉÆ
¶ÔÓÚÉÏһС½ÚÌáµ½µÄJavaµÄ¾ÖÏÞ£¬ÔÚOSGiÖж¼µÃµ½Á˺ܺõĽâ¾ö¡£
°üµÄ¿É¼ûÐÔ£ºOSGiͨ¹ýÒýÈë°üµÄ¿É¼ûÐÔ»úÖÆ£¬Äܹ»ÍêÈ«¿ØÖÆÒ»¸ö°üÖеĴúÂë¶ÔÄÄЩģ¿é¿É¼û£¬¶ø²»½ö½ö¾ÖÏÞÓÚÎÞ²î±ðµÄ¿É¼ûÐÔ£¬´Ó¶øÍêÉÆÁËJavaµÄ´úÂë·ÃÎÊ¿ØÖÆ»úÖÆ¡£
°üµÄ°æ±¾£º OSGiͨ¹ýΪ°üÔö¼Ó°æ±¾ÐÅÏ¢£¬¿ÉÒÔ¾«È·¿ØÖÆ´úÂëµÄÒÀÀµ£¬±£Ö¤´úÂëµÄ°æ±¾Ò»ÖÂÐÔ£¬ÃÖ²¹ÁËclasspathµÄȱµã¡£
3 OSGiÄ£¿é²ã»ù´¡
3.1 BundleµÄ¸ÅÄî
ÕâÊÇÄ£¿é²ã×îºËÐĵĸÅÄҲÊÇÄ£¿é£¨module£©Õâ¸ö¸ÅÄîÔÚOSGiÖеľßÏó±íÏÖ¡£½ÓÏÂÀ´Ä㽫»áÔÚOSGiµÄÊÀ½çÖд´½¨ºÍʹÓÃÊý²»Ê¤ÊýµÄbundle¡£
ʲôÊÇbundle£¿¡ª¡ªbundleÊÇÒÔjar°üÐÎʽ´æÔÚµÄÒ»¸öÄ£¿é»¯ÎïÀíµ¥Ôª£¬ÀïÃæ°üº¬ÁË´úÂ룬×ÊÔ´ÎļþºÍÔªÊý¾Ý£¨metadata£©£¬²¢ÇÒjar°üµÄÎïÀí±ß½çҲͬʱÊÇÔËÐÐʱÂ߼ģ¿éµÄ·â×°±ß½ç¡£

Ò»¸ö¸üΪֱ¹ÛµÄ˵Ã÷£ºÔÚ±ê×¼µÄjar°üµÄmanifestÎļþÖÐÌí¼ÓһЩbundleµÄÄ£¿é»¯ÌØÕ÷£¨¾ÍÊÇÇ°ÃæÌáµ½µÄmetadata£©ºó£¬Õâ¸öjar°ü¾Í±ä³ÉÁËÒ»¸öbundle¡£
ÄÇôÓÐÁËÉÏÃæµÄÃèÊö£¬Äã´ó¸ÅÒ²ÄÜÏëµ½£¬bundleºÍÆÕͨjar°ü×î´óµÄÇø±ð¾ÍÔÚÓÚÔªÊý¾Ý¡£
3.2 ʹÓÃÔªÊý¾ÝÀ´¶¨Òåbundle
BundleÔªÊý¾ÝµÄÄ¿µÄÔÚÓÚ׼ȷÃèÊöÄ£¿é»¯Ïà¹ØµÄbundleÌØÕ÷£¬ÕâÑù²ÅÄÜÈÃOSGi¿ò¼ÜÇ¡µ±µÄ¶Ôbundle½øÐи÷ÖÖ´¦Àí¹¤×÷£¨±ÈÈçÒÀÀµ½âÎö£¬Ç¿ÖÆ·â×°µÈ£©£¬ÕâЩԪÊý¾ÝÖ÷ÒªÓÐÕâÈý¸ö²¿·Ö£º
¿É¶ÁµÄÐÅÏ¢£¨¿ÉÑ¡£©£º°ïÖú¸üºÃµØÀí½âºÍʹÓÃbundle
bundleµÄ±êʶ·û£¨±ØÐ룩£ºÎ¨Ò»µÄ±êʶһ¸öbundle
´úÂë¿É¼ûÐÔ£¨±ØÐ룩£º¶¨ÒåÄÚ²¿ÓëÍⲿ´úÂë
3.2.1 ¿É¶ÁµÄÐÅÏ¢
ÕâЩÄÚÈÝ¿ÉÒÔ°ïÖúÈËÃÇÖ±¹ÛµÄÁ˽âÕâ¸öbundleÊÇ×öʲôµÄ£¬´ÓÄÄÀïÀ´¡£OSGi±ê×¼¶¨ÒåÁ˼¸¸öÔªÊý¾ÝÌõÄ¿À´´ïµ½Õâ¸öÄ¿µÄ£¬µ«ÊÇËùÓеÄÌõÄ¿¶¼²»ÊDZØÐëµÄ£¬²¢ÇÒÒ²²»¶ÔÄ£¿é»¯ÌØÐÔ²úÉúÈκεÄÓ°Ï죬OSGi¿ò¼Ü»áÍêÈ«ÎÞÊÓÕâЩÄÚÈÝ¡£
ÏÂÃæ¾ÍÊÇÒ»¸öÕâÀàÐÅÏ¢µÄÀý×Ó£º
Bundle-Name: SERC Helloworld Bundle-Vendor: GR, SERC Bundle-DocURL: http://elevenframework.org Bundle-Category: example Bundle-Copyright: SERC |
3.2.2 bundleµÄ±êʶ·û
ÔÚÉϸöС½ÚÌáµ½µÄ¿É¶ÁÐÅÏ¢ÖУ¬ÓÐÐ©ËÆºõÒ²ÄÜÓÃÀ´Î¨Ò»±êʶһ¸öbundle£¬±ÈÈçBundle-Name£¬µ«ÊÇÊÂʵÉÏ£¬Ëû²¢Ã»Óб»ÓÃÀ´±êʶһ¸öbundle¡£ÔçÆÚµÄOSGi±ê×¼Öв¢Ã»ÓÐÌṩ±êʶһ¸öÒÑÖªbundleµÄ·½·¨£¬Ö±µ½OSGi
R4±ê×¼¡°Î¨Ò»bundle±êʶ·û¡±Õâ¸ö¶«Î÷²Å±»Ìá³öÀ´¡£ÎªÁËÏòºó¼æÈÝ£¬Bundle-Name¾Í²»ÄÜÓÃÀ´×÷Ϊ±êʶ·ûÁË£¬·ñÔò¾Í»áÔö¼Óά»¤Ïòºó¼æÈݵŤ×÷£¬ËùÒÔеÄmanifestÊôÐԾ͵®ÉúÁË£ºBundle-SymbolicName
Bundle-SymbolicName: org.serc.helloworld
Á½ÕßÏà±È£¬Bundle-NameÊǸøÓû§¶ÁµÄ£¬¶øBundle-SymbolicNameÊǸøOSGi¿ò¼Ü¶ÁµÄ£¬ÈÃOSGi¿ò¼ÜÄܹ»Î¨Ò»±êʶһ¸öbundle¡£
Ö»ÓÃÒ»¸öBundle-SymbolicName¿Ï¶¨ÊÇ¿ÉÒÔΨһ±êʶһ¸öbundleÁË£¬µ«ÊÇËæ×Åʱ¼äµÄÍÆÒÆ£¬ÄãµÄbundle¿ÉÄÜ»áÓÐа汾£¬Õâʱºò¼ÓÈë°æ±¾ÊôÐÔ»áÈÃÄãµÄbundleµÄÐÅÏ¢¸ü¼Ó׼ȷ¡£
Bundle-Name: SERC Helloworld Bundle-Vendor: GR, SERC Bundle-DocURL: http://elevenframework.org Bundle-Category: example Bundle-Copyright: SERC |
3.2.3 ´úÂë¿É¼ûÐÔ
ÔÚJavaSEÖеÄjar°üÈç¹û·ÅÔÚÁËclasspathÀïÃæ£¬ÄÇôËü¶ÔÕâ¸öclasspathϵÄËùÓгÌÐò¶¼ÊǿɼûµÄ£¬²¢ÇÒÕâÖֿɼûÐÔ²»Äܸı䣬¶øOSGi±ê×¼¶¨ÒåÁËÈçϵÄÊôÐÔÓÃÓÚÃèÊö´úÂëµÄ¿É¼ûÐÔ£º
Bundle-ClassPath¡ªËü¶¨ÒåÁËÐγÉÕâ¸öbundleµÄËùÓдúÂëËùÔÚµÄλÖ㬺ÍJavaµÄclassathµÄ¸ÅÄîÏà½ü£¬²»Í¬µãÔÚÓÚ£¬JavaÖеÄclasspathÊǶ¨ÒåµÄjar°üµÄλÖ㬶øÕâ¸öÊôÐÔÃèÊöµÄÊÇbundleÄÚ²¿µÄÀàÔÚbundleÖеÄ·¾¶¡£ÓÐÀý×ÓÈçÏ£º
Bundle-ClassPath:.,other-classes/,embedded.jar |
Export-Package¡ªÏÔʽ±©Â¶ÐèÒªºÍÆäËûbundle¹²ÏíµÄ´úÂ룬ÿ¸ö°üÖ®¼äÓöººÅ·Ö¸ô£¬Ã¿¸ö°ü¿ÉÓÃÐÞÊδÊÀ´ÐÞÊΰüµÄÆäËûÌØÕ÷¡£
Export-Package: org.serc.hellworld; vendor=¡±SERC¡±, org.serc.hellworld.impl; vendor=¡±Gou Rui¡± |
Import-Package¡ª¶¨Òå¸ÃbundleËùÒÀÀµµÄÍⲿ´úÂ룬Æä¸ñʽºÍExport-PackageÏàͬ£¬²¢ÇÒÒ²¿ÉÒÔʹÓÃÐÞÊδÊÀ´ÐÞÊΰü¡£²»¹ýÕâÀïµÄÐÞÊδÊÊÇÓÃÀ´ÏÞÖÆËùÒÀÀµ°üµÄ·¶Î§µÄ£¬ÏñÊÇÒ»¸ö¹ýÂËÆ÷£¬¶ø²»ÏñExport-PackageÖÐÓÃÀ´ÉùÃ÷°üµÄÌØÕ÷¡£ÀýÈçÈçÏÂÓï¾ä£º
Import-Package: org.serc.helloworld; vendor=¡±SERC¡± |
4 ×ܽá
ͨ¹ýÕâÒ»Õ£¬Ï£Íû¶ÁÕßÃÇÄܹ»¶ÔOSGiÄ£¿é²ãÓÐÒ»¸ö³õ²½µÄÁ˽⣬Ã÷°×ÕâÒ»²ã×ÅÖØ½â¾öµÄÊÇһЩʲôÎÊÌ⣬²¢ÇÒÔÚÕâÖ®ºóÅäºÏ×Å¡¶OSGi¿ª·¢»·¾³µÄ½¨Á¢ºÍHelloWorld¡·ÕâÒ»Õ¿ÉÒÔ³¢ÊÔ×Å×Ô¼º´´½¨Ò»¸öbundle£¬Í¨¹ýÔÚMANIFESTÎļþÖÐÌîдԪÊý¾ÝÀ´±©Â¶Ò»Ð©°ü£¬ÒýÈëһЩ°ü¡£ÔÚÏÂһƪÈëÃÅÆªÖУ¬ÎÒÃǽ«½²½âOSGiµÄÉúÃüÖÜÆÚ²ã¡£
|