ÔÚPart1ÖУ¬ÎÒÃÇÌáµ½ÁËÆóÒµ¼¶OSGiÖÆ¶¨ÁËһϵÁеĹ淶À´ÓëJavaEE¼¯³É£¬ÆäÖУ¬×î¾ß´ú±íÐԵĹ淶ÊÇOSGi
WEBÓ¦ÓóÌÐò¹æ·¶£¬Õⲿ·Ö½«´øÁì´ó¼ÒÉîÈëÀí½âOSGi WEBÓ¦ÓóÌÐò¹æ·¶ºÍGlassFish OSGi/WEBÈÝÆ÷¡£
Àí½âOSGi WEBÓ¦ÓóÌÐò¹æ·¶
ΪʲôÐèÒªOSGi WEB
ÔÚÐÅÏ¢ºÍÍøÂç·¢´ïµÄ½ñÌ죬WEBÓ¦ÓóÌÐòÒѾ·Ç³£µÃÁ÷ÐÐºÍÆÕ±é£¬Ò»Ð©ÈÎÎñ¹Ø¼üÐÍ(Mission-Critical)µÄWEBÓ¦ÓóÌÐòÿÌì¶¼Ôڸ߸ººÉµØÔËÐУ¬ºÜÉÙÓÐÖжϣ¬ÒòΪһ´Î²»¾ÒâµÄÖжϿÉÄÜÔì³ÉÊý¾ÝµÄ´ó¹æÄ£¶ªÊ§£¬ÒÔÖÁËðʧ´óÁ¿µÄ×ʽð¶øÔì³ÉÑÏÖØµÄºó¹û¡£ÕâЩÈÎÎñ¹Ø¼üÐ͵ÄWEBÓ¦ÓÃÍùÍù³öÏÖÔÚ֤ȯºÍ¹ÉƱµÈÏà¹ØµÄ½ðÈÚÐÐÒµ¡£ÏÖÔÚ£¬ÎÒÃÇ¿ªÊ¼¿¼ÂÇÒ»¸ö³¡¾°:
¼¸¸öÐÇÆÚ»òÕß¼¸¸öÔÂÉõÖÁ¼¸Äêºó£¬WEBÓ¦ÓõĿͻ§»òÕßÌṩÉÌÏ£ÍûÔÚWEBǰ¶ËÔö¼ÓһЩеÄÄ£¿é»ò¹¦ÄÜ£¬µ«ÊÇ£¬ÎªÁËÔö¼ÓÕâЩеÄÄ£¿é£¬ÎÒÃDz»ÄÜÍ£Ö¹WEBÓ¦Ó㬶øÇÒÒ²²»Ï£ÍûÔÙ´ÎÖØ¹¹»òÕ߸ıäWEBÓ¦ÓõÄÏÖÓмܹ¹ºÍÄ£¿é¡£ÕâÌýÆðÀ´²»¿É˼Ò飬¶ÔÓÚÕâÑùÒ»¸ö³¡¾°£¬ÖÁÉÙÓ¦¸ÃÍ£Ö¹Ó¦Óó̷þÎñµÄʵÀý°É¡£µ«ÊÇ£¬¿Í»§²»»á´ðÓ¦¡£ÁíÒ»·½Ã棬ÔÚµ±½ñ´óÊý¾ÝµÄʱ´ú£¬Ã¿Ò»ÃëÖÓ¶¼»áÓдóÁ¿µÄÊý¾Ý½øÈëÎÒÃǵÄÓ¦ÓÃÖ®ÖС£ÄÇô£¬ÈçºÎ½â¾öÕâÑùµÄ³¡¾°£¿
Ò»¸ö¿ÉÐеĴð°¸ÊÇ: ʹÓÃOSGi WEB¹¹½¨ÎÒÃǵÄÓ¦Óá£
WAB-OSGi WEBµÄºËÐÄ
¼òµ¥µØËµ£¬OSGi WEBÓ¦ÓóÌÐò¹æ·¶(chapter 128 in the
OSGi Enterprise Release 5 Specification[1])¶¨ÒåÁËOSGi WEBµÄÈ«²¿ÄÚÈÝ¡£¶ÔÓÚOSGi
WEBÓ¦ÓóÌÐò£¬µäÐÍÇé¿öÏ£¬ËüÓÉÒ»¸öWEBÓ¦ÓóÌÐòBundle£¨¼´Web Application Bundle£¬¼ò³ÆÎªWAB£©Ëù¹¹³É¡£
Òò´Ë£¬Ê×ÏÈÎÒÃÇÐèÒªÀí½âWABÒÔ¼°ºÍWARµÄÇø±ð¡£
WAB¼òÊö
ÔÚPart1ÖУ¬ÎÒÃÇÒѾÌáµ½BundleÊÇOSGiÖеĻù±¾²¿ÊðºÍ¹ÜÀíʵÌå¡£ËùÒÔ£¬WABÊ×ÏÈÊÇÒ»¸öBundle£¬±ØÐëÌṩ³ÉΪBundleµÄOSGiÔªÊý¾Ý(Èç,
Bundle-SymbolicName, Bundle-Version¡)£¬Æä´Î£¬WABÓëJavaEEÖеÄWARÒ»Ñù£¬ÒÀÈ»ÊÇ·þÎñÓÚWEBÓ¦ÓóÌÐò£¬Äܹ»Ê¹ÓÃServlet
2.5»ò¸ü¸ß°æ±¾µÄServlet¹æ·¶£¬Òò´Ë£¬WAB±ØÐë°üº¬¿É·ÃÎʵÄWEBÄÚÈÝ£¬¾ßÌåµÄ˵£¬Java Servlet¹æ·¶¶¨ÒåÁËÒ»¸öWEBÓ¦ÓóÌÐòµÄ½á¹¹²¢¶¨ÒåÁËÒ»¸ö»ùÓÚJARµÄÎļþ¸ñʽ£¨WAR£©£¬WAB±ØÐë°üº¬WARÖеľ²Ì¬ºÍ¶¯Ì¬µÄÄÚÈÝ¡£
½øÒ»²½µØ£¬Òª³ÉΪһ¸öWAB£¬ÐèÒªÔÚMANIFEST.MFÎļþÖÐͨ¹ýImport-PackageÀ´ÃèÊöËüµÄÒÀÀµ£¬ÀýÈç:
ͨ¹ýµ¼Èëjavax.servletÀ´Ê¹ÓÃServletµÄ¹¦ÄÜ£¬ÁíÍ⣬Èç¹ûÐèÒªÏòÍâ½çÌṩ·þÎñ£¬ËüҲҪͨ¹ýExport-PackageÀ´µ¼³ö·þÎñËùÔڵİü¡£
ÎÒÃÇÄܹ»Í¨¹ý²»Í¬µÄ·½Ê½À´°²×°WAB£¬ÀýÈ磬ͨ¹ýÖ§³ÖÆóÒµ¼¶OSGiµÄÓ¦Ó÷þÎñÆ÷ËùÌṩµÄÃüÁîÐпØÖÆÌ¨(È磬GlassFish
Admin CLI)£¬Ò²¿ÉÒÔͨ¹ý³ÌÐòµÄ·½Ê½µ÷ÓÃOSGiµ×²ãAPIÀ´°²×°WAB(È磬BundleContext.installBundle)¡£ÎÞÂÛÄÄÒ»ÖÖ·½Ê½£¬WAB°²×°ºó£¬ËüµÄÉúÃüÖÜÆÚ¹ÜÀí¾ÍÏñOSGiÔËÐÐʱµÄÆäËûBundleÒ»Ñù¡£Ö»²»¹ýWABµÄÉúÃüÖÜÆÚ±»Ò»¸öWeb
Extender¸ú×Ù£¬Ò»µ©WAB×¼±¸·þÎñWEBÇëÇóʱ£¬Web ExtenderÐèÒª½«WABÖпɷÃÎʵÄWEBÄÚÈݲ¿Êðµ½WEBÔËÐÐʱ¡£ÒÔºóµ±WAB²»ÔÙ·þÎñWEBÇëÇóʱ£¬Web
ExtenderÒ²ÐèÒª½«ÕâЩ¿É·ÃÎʵÄWEBÄÚÈÝ´ÓWEBÔËÐÐÊ±Ð¶ÔØµô¡£
¹ØÓÚWABµÄ°²×°£¬ÓÐÒ»µãÐèÒª¶îÍâ˵Ã÷£¬Ò»¸öWEBÓ¦ÓóÌÐòÄܹ»ÔÚ¿ª·¢½×¶Îͨ¹ý¹¤¾ß(ÀýÈç,
Maven²å¼þ)±»´ò°ü³ÉWABÈ»ºó½øÐа²×°£¬»òÕßÕâ¸öWEBÓ¦ÓóÌÐòÄܹ»ÔÚBundle°²×°½×¶Îͨ¹ýWeb
URL Handler¶Ô±ê×¼WAR½øÐÐת»»À´Í¸Ã÷µØ´´½¨WAB¡£GlassFish 4ÒѾʵÏÖÁ˺óÒ»ÖÖ»úÖÆ£¬ÎÒ½«ÔÚºóÐøÕ½ÚÏêϸ²ûÊö¡£
¹ØÓÚWeb ExtenderºÍWeb URL Handler£¬ËüÃǶ¼ÊÇOSGi
WEBÈÝÆ÷µÄÒ»²¿·Ö£¬ÎÒÃǽ«ÔÚºóÃæÕ½ÚÏêϸ²ûÊö¡£
´ÓÉÏÃæµÄÐðÊö£¬ÎÒÃÇÒѾ¿´µ½Á˰²×°WABÓë°²×°ÆÕͨBundleµÄÃ÷ÏԵIJ»Í¬Ö®´¦:
³ýÁ˰²×°WABµ½OSGiÔËÐÐʱ£¬»¹ÐèÒª½«WABÖпɷÃÎʵÄWEBÄÚÈݲ¿Êðµ½WEBÔËÐÐʱ¡£¹ØÓÚÕâÒ»µã£¬OSGi
WEBÓ¦ÓóÌÐò¹æ·¶¶¨ÒåÁËWABµÄÉúÃüÖÜÆÚ״̬ͼ£¬

ͼ1: WABµÄÉúÃüÖÜÆÚ״̬ͼ
ÎÒÃǽ«ÔÚºóÐøÕ½ÚÖÐÉîÈë²ûÊöͼ1ÖеÄÿ¸ö½×¶Î¡£
WAB¶¨Òå
WAB±¾Éí¾ÍÊÇÒ»¸öOSGi Bundle£¬Òò´Ë£¬¶ÔÓÚ±ê×¼OSGi BundleµÄ¶¨ÒåͬÑùÊÊÓÃÓÚWAB£¬µ«ÊÇ£¬WABÓë±ê×¼OSGi
Bundle±¾ÖʵÄÇø±ðÔÚÓÚ: WABÐèÒªÔÚMANIFEST.MFÖж¨ÒåWeb-ContextPathÊôÐÔ¡£Web-ContextPathÊôÐÔ¶¨ÒåÁËÕâ¸öWEBÓ¦ÓóÌÐò·ÃÎʵÄÉÏÏÂÎÄ·¾¶(Context
Path)[2]£¬ÔÚWEB·þÎñÆ÷ÉÏ£¬Õâ¸öWEBÓ¦ÓóÌÐòÖÐËùÓпɷÃÎʵÄ×ÊÔ´¶¼ÒªÏà¶ÔÓÚÕâ¸öÉÏÏÂÎÄ·¾¶¡£ÀýÈç,
Èç¹ûÔÚMANIFEST.MF¶¨ÒåÁËÒÔÏÂWeb-ContextPathÊôÐÔ£¬
Web-ContextPath: /uas
ÄÇô·ÃÎÊÕâ¸öWEBÓ¦ÓóÌÐòµÄURL×ÜÊÇÏà¶ÔÓÚhttp://host:port/uas£¬ÐèҪעÒâµÄÊÇ:
Web-ContextPathÊôÐÔµÄÖµ×ÜÊÇÒÔб¸Ü¡¯/¡¯¿ªÊ¼¡£
µ±°²×°WABʱ£¬³ý·ÇWeb-ContextPathÊôÐÔ³öÏÖÔÚMANIFEST.MFÖÐÇÒWeb-ContextPathµÄÖµÊÇÒ»¸öÓÐЧµÄÖµ£¬·ñÔò£¬Web
Extender»áÈÏΪÕâ²»ÊÇÒ»¸öWAB£¬¶øÊÓΪһ¸öÆÕͨµÄBundle¡£
WAB½á¹¹ºÍÏà¹ØµÄOSGiÔªÊý¾Ý
ÉÏÃæÒѾ¿´µ½£¬³ýÁ˱ê×¼OSGiÔªÊý¾Ý£¬WAB±ØÐëÒªÔÚMETA-INF/MANIFEST.MFÎļþÖж¨ÒåWeb-ContextPathÊôÐÔ¡£ÀýÈ磬ÒÔÏÂÊÇÒ»¸öWABµÄ½á¹¹£¬

ͼ2: Ò»¸öWABµÄ½á¹¹Ê¾Àý
Õâ¸öWAB¶¨ÒåµÄOSGiÔªÊý¾ÝÈçÏÂËùʾ£¬

ͼ3:ͼ2µÄWABµÄOSGiÔªÊý¾ÝʾÀý
ÔÚͼ2ÖУ¬ÎÒÃǶ¨ÒåÁËÒ»¸öWAB£¬Õâ¸öWABÖÐÓÐÒ»¸öServlet£¬±»·ÅÔÚÁËWEB-INF/classesĿ¼Ï£¬¶øÇÒÕâ¸öWABÓÐÁ½¸öÄÚ²¿ÒÀÀµ£¬lib1.jarºÍlib2.jar¡£µ±°²×°WABʱ£¬ÎªÁËʹÕâЩ¶¯Ì¬µÄÄÚÈݶ¼Äܹ»±»Web·þÎñÆ÷·ÃÎʵ½£¬ÎÒÃǾͱØÐëÔÚÕâ¸öWABµÄMANIFEST.MFÖа´ÕÕÒ»¶¨µÄ¹æÔòÖ¸¶¨OSGiÔªÊý¾Ý£¬Ò²¾ÍÊÇͼ3ËùʾµÄÄÇÑù£¬
1.Ö¸¶¨Ò»Ð©±ØÐëµÄÊôÐÔ°üÀ¨Bundle-ManifestVersion¡¢Bundle-SymbolicName¡¢Bundle-Version¡£Bundle-NameÊÇ¿ÉÑ¡µÄ£¬ÕâÊÇÒ»¸öÀúÊ·ÒÅÁôµÄÊôÐÔ£¬Äã¿ÉÒÔ²»ÓÃÖ¸¶¨Ëü£¬µ«ÊÇÎÒͨ³£Ò²»áÖ¸¶¨Õâ¸öÊôÐÔ£¬ÒòΪ£¬Bundle-NameÊôÐÔµÄÖµ¿ÉÒÔÓÃÀ´·´Ó³BundleµÄÓÃ;¡£
2.Ö¸¶¨Import-PackageÊôÐÔ£¬ÒòΪÕâ¸öWABÕýÔÚʹÓÃServlet£¬ËùÒÔÎÒÃǵ¼ÈëÁËServletÏà¹ØµÄ°ü¡£
3.Ö¸¶¨Bundle-ClassPathÊôÐÔ£¬Õâ¸öÊôÐԷdz£ÖØÒª£¬Ëü¶¨ÒåÁËÈçºÎ¼ÓÔØÄÚ²¿µÄÒÀÀµºÍWAB×ÔÉíµÄÀ࣬ÎÒÃǰÑWEB-INF/classes/·ÅÔÚWEB-INF/lib/lib1.jarºÍWEB-INF/lib/lib2.jarµÄÇ°Ãæ£¬ÕâÑù×öÊÇΪÁ˺ʹ«Í³WARÎļþËÑË÷ÀàµÄ˳ÐòÒ»Ö£¬¼òµ¥µØËµ£¬ÓÅÏÈËÑË÷WAB×ÔÉíµÄClass£¬È»ºóÔÙËÑË÷ÒÀÀµµÄ¿âÎļþ¡£
4.Ö¸¶¨Web-ContextPathÊôÐÔ¡£
ͨ¹ý¶ÔMANIFEST.MF×·¼ÓOSGiÔªÊý¾Ý£¬Ò²ÔÙ´Î˵Ã÷ÁËWABʹÓÃOSGiÉúÃüÖÜÆÚºÍÀà/×ÊÔ´¼ÓÔØ¹æÔò¶ø²»ÊDZê×¼JavaEE»·¾³µÄ¼ÓÔØ¹æÔò£¬ÕâµãÖÁ¹ØÖØÒª¡£
WABµÄÉúÃüÖÜÆÚ
ÔÚͼ1ÖÐÒѾÌáµ½ÁËWABµÄÉúÃüÖÜÆÚ£¬×ÐϸµØÓë±ê×¼OSGi BundleµÄÉúÃüÖÜÆÚ±È½Ïһϣ¬Äã»á·¢ÏÖ£¬WABµÄÉúÃüÖÜÆÚ¶àÁËËĸö½×¶Î(DEPLOYING¡¢DEPLOYED¡¢UNDEPLOYINGºÍUNDEPLOYED)¡£
µ±Ò»¸öWAB´¦ÓÚDEPLOYED½×¶Îʱ£¬ËüÒѾ×öºÃÁË×¼±¸À´·þÎñ¼´½«µ½À´µÄWEBÇëÇó¡£´¦ÓÚDEPLOYED½×¶ÎÒ²Òâζ×ÅÕâ¸öWAB»òÕß´¦ÓÚACTIVE״̬£¬»òÕß´¦ÓÚSTARTING״̬(ÒòΪÓÐÒ»¸öÀÁ¶èµÄ¼¤»î²ßÂÔ)¡£¹ØÓÚÀÁ¶èµÄ¼¤»î²ßÂÔ£¬ÔÚ¡¶OSGi
In Action¡·Ò»ÊéµÚ 9.3½Ú¡°Starting bundles lazily¡±Óо«²ÊµÄ½éÉÜ¡£
¶ÔÓÚ¾ßÓÐÀÁ¶èµÄ¼¤»î²ßÂÔµÄWABÀ´Ëµ£¬Web ExtenderÓ¦¸ÃÈ·±£µ±·þÎñWEBµÄ¾²Ì¬ÄÚÈÝ(ÈçͼÏñ×ÊÔ´¡¢HTMLºÍCSSµÈ)ʱ²»Äܸıä¸ÃWABËù´¦µÄ״̬£¬¼´ÈÔȻʹËü´¦ÓÚSTARTING״̬¡£
´Óͼ1ÖУ¬ÎÒÃÇÄܹ»Çå³þµØ¿´µ½£¬ÎªÁËÈÃWABÄܹ»·þÎñ¼´½«µ½À´µÄWEBÇëÇó£¬WABÐèÒª´Ó
DEPLOYINGÇ¨ÒÆµ½DEPLOYED½×¶Î£¬Web Extender±ØÐ벿ÊðWABÖеÄWEBÓ¦ÓóÌÐòÏà¹ØµÄÀàºÍ×ÊÔ´µ½WebÔËÐÐʱ¡£¾ßÌ嵨£¬
1.µÈ´ýWAB´¦ÓÚACTIVE״̬»òSTARTING״̬
2.·¢ËÍorg/osgi/service/web/DEPLOYINGʼþ
3.ÑéÖ¤Web-ContextPathÊôÐÔµÄֵûÓÐºÍÆäËûÒѾ±»²¿ÊðµÄWEBÓ¦ÓóÌÐòµÄÉÏÏÂÎÄ·¾¶³åÍ»£¬Ò²¾ÍÊÇ˵±£Ö¤ÉÏÏÂÎÄ·¾¶µÄΨһÐÔ¡£Èç¹ûÓгåÍ»£¬ÄÇô²¿ÊðWABʧ°Ü£¬Web
ExtenderÓ¦¸Ã¼Ç¼Ï²¿Êðʧ°ÜµÄÈÕÖ¾¡£
4.Èç¹û3µÄÑé֤ͨ¹ý£¬ÄÇô°´ÕÕÒÔϵÄ˳Ðò£¬WebÔËÐÐʱ¿ªÊ¼´¦Àí²¿ÊðÏà¹ØµÄϸ½Ú£¬Èç¹ûweb.xml´æÔڵϰ£¬ËüÒ²»á´¦Àíweb.xmlÖеÄÄÚÈÝ¡£
1£©ÎªÕâ¸öWEBÓ¦ÓóÌÐò´´½¨Ò»¸öServletÉÏÏÂÎÄ
2£©³õʼ»¯ÅäÖõÄServletʼþÕìÌýÆ÷
3£©³õʼ»¯ÅäÖõÄÓ¦ÓóÌÐò¹ýÂËÆ÷µÈ
5.×¢²áServletÉÏÏÂÎÄ×÷ΪOSGi·þÎñ
6.·¢ËÍorg/osgi/service/web/DEPLOYEDʼþ֪ͨµ±Ç°µÄWABÒѾ׼±¸ºÃÁË£¬¿ÉÒÔ·þÎñWEBÇëÇó¡£
Èç¹ûÔÚorg/osgi/service/web/DEPLOYEDʼþ·¢ËÍǰµÄÈκÎʱºòÓÐÒì³£»ò´íÎó·¢Éú£¬ÄÇôWABµÄ²¿Êð½«Ê§°Ü¡£
ͼ1ÖÐÎÒÃÇÒ²Äܹ»·¢ÏÖ£¬Ò»µ©²»ÔÙÐèÒª¸ÃWAB·þÎñWebÇëÇóʱ£¬ÄÇô¸ÃWABÐèÒª´ÓDEPLOYED¾¹ýUNDEPLOYINGÇ¨ÒÆµ½UNDEPLOYED½×¶Î£¨UNDEPLOYINGÊÇÒ»¸öÔÝ̬£©¡£
Óм¸ÖÖ·½·¨Äܹ»Ê¹WAB´¦ÓÚUNDEPLOYED½×¶Î,
·½·¨1: Í£Ö¹WAB
1.Ò»µ©½ÓÊÕµ½WAB STOPPINGʼþ£¬Web Extender±ØÐëÁ¢¿Ì´ÓWebÔËÐÐʱÖÐundeploy
WebÓ¦ÓóÌÐò×ÊÔ´¡£UndeployµÄÖ÷Òª²½ÖèÈçÏÂ:
2.·¢ËÍorg/osgi/service/web/UNDEPLOYINGʼþ֪ͨWebÓ¦ÓóÌÐò×ÊÔ´½«±»undeploy¡£
3.´ÓOSGi×¢²á±íÖÐÒÆÈ¥ServletÉÏÏÂÎÄ¡£
4.WebÔËÐÐʱ±ØÐëÈøÃWebÓ¦ÓóÌÐòÍ£Ö¹·þÎñÇëÇó¡£
5.WebÔËÐÐʱ±ØÐëÇåÀíËùÓÐWebÓ¦ÓóÌÐòÏà¹ØµÄ×ÊÔ´£¬ÈçÕ¼ÓõÄJAR£¬ÒÔ¼°ÇåÀíClassLoader±ÜÃâÄÚ´æÐ¹Â©µÈ¡£
6.·¢ËÍorg/osgi/service/web/UNDEPLOYEDʼþ¡£
·½·¨2: Ð¶ÔØ(Uninstall)WAB
³ýÁËÍ£Ö¹WAB£¬Ò²Äܹ»Í¨¹ý´ÓOSGiÔËÐÐʱÖÐÐ¶ÔØWABÀ´undeploy¶ÔÓ¦µÄWebÓ¦ÓóÌÐò×ÊÔ´£¬undeploy²½ÖèºÍ·½·¨1Ò»Ñù¡£
·½·¨3£ºÍ£Ö¹Web Extender
µ±Í£Ö¹Web Extenderʱ£¬ËùÓб»²¿ÊðµÄWAB¶¼½«±»undeploy£¬µ«ÊÇ£¬¾¡¹ÜWAB±»undeployÁË£¬ËüÈÎÈ»´¦ÓÚACTIVE״̬¡£
´ÓÒÔÉÏ¿ÉÒԵóö£¬WABÉúÃüÖÜÆÚµÄËĸöÌØÓÐ״̬²»Í¬ÓÚ±ê×¼OSGi BundleµÄ״̬£¬WABÉúÃüÖÜÆÚµÄÌØÓÐ״̬²¢²»ÊÜOSGiÉúÃüÖÜÆÚ²ã¿ØÖÆ£¬²»ÊDZê×¼µÄOSGi״̬£¬ÕâÐ©ÌØÓеÄ״̬½ö½öÓÉWeb
Extender¿ØÖÆ¡£
¹ØÓÚWABÉúÃüÖÜÆÚ£¬ÔÚ¡°ÉîÈëÆÊÎöGlassFish OSGi/WEBÈÝÆ÷¡±Öн«ÔٴβûÊö¡£
ÁíÍ⣬µ±ÄãÔĶÁOSGi Enterprise Release 5 Specificationʱ£¬ÌرðҪעÒâ²»Äܽ«UninstallºÍUndeploy»ìΪһ̸£¬¾¡¹ÜÔÚһЩ³¡ºÏÏÂÕâÁ½¸öÊõÓï¶¼Äܹ»Àí½âΪ¡°Ð¶ÔØ¡±¡£
OSGi WebÈÝÆ÷
×îºóÎÒÃÇÀ´Ì¸Ò»ÏÂOSGi WebÈÝÆ÷£¬ÔÚÉÏÃæµÄÕ½ÚÖÐÎÒÃÇÒѾ¶à´ÎÌáµ½ÁËWeb
Extender£¬Web ÔËÐÐʱÒÔ¼°Web URL Handler¡£ÕâЩʵÌå¹¹³ÉÁËOSGi WebÈÝÆ÷£¬¶øOSGi
WebÈÝÆ÷ÊÇOSGi Web¹æ·¶µÄʵÏÖ¡£¸ù¾ÝOSGi Web¹æ·¶£¬OSGi WebÈÝÆ÷ÓÉÒÔÏÂÈý¸öʵÌå¹¹³É:
1.Web Extender
ÑéÖ¤ÊÇ·ñΪWAB²¢ÇÒ¸ú×ÙWABµÄÉúÃüÖÜÆÚ£¬Í¬Ê±¸ºÔð²¿ÊðWABµ½WebÔËÐÐʱÒÔ¼°undeployÒ»¸ö±»²¿ÊðµÄWAB¡£
2.WebÔËÐÐʱ
WebÓ¦ÓóÌÐòÔËÐÐʱ»·¾³£¬¶ÔÓÚGlassFishÀ´Ëµ£¬WebÔËÐÐʱ»ùÓÚTomcat
Catalina¡£
3.Web URL Handler
Ò»¸öURL Stream Handler£¬Õâ¸öURL Stream HandlerÄܹ»´¦Àíwebbundle:
scheme£¬Õâ¸öschemeÄܹ»±»ÓÃÀ´×ª»»ÒÔ¼°°²×°WARµ½OSGiÔËÐÐʱÖУ¬GlassFish 4ÌṩÁËÒ»¸öеÄÌØÐÔ£¬¼´Í¨¹ýʵÏÖÕâ¸öURL
Stream HandlerÔÚ²¿Êðʱ×Ô¶¯×ª»»ºÍ°²×°WARµ½OSGiÔËÐÐʱ¡£
¹¹½¨Ò»¸öOSGi WEBÓ¦ÓóÌÐò
»Øµ½¿ªÊ¼Ìá³öµÄÎÊÌⳡ¾°£¬¼´ÈçºÎÔÚ²»Í£Ö¹JVMµÄÇé¿öÏ£¬¹¹½¨Ò»¸ö¶¯Ì¬µÄWebÓ¦ÓóÌÐò£¿
ÒÔϵÄSampleÓ¦ÓóÌÐòÔ´ÓÚÎÒÔø¾µ÷²éµÄÒ»¸öGlassFishÎÊÌâ [3]£¬ÏÈ¿´Ò»ÏÂÐèÇó£¬
ÎÊÌⳡ¾°
ÎÒÃÇÏ£Íû¹¹½¨ÕâÑùÒ»¸öWebÓ¦ÓóÌÐò£¬µ±Æô¶¯Õâ¸öWebÓ¦ÓóÌÐòʱ£¬Ã»ÓÐÈκÎWebÄ£¿é±»¼ÓÔØ£¬½çÃæÏÔʾ¡°No
modules available.¡±£¬È»ºó£¬µ±²¿ÊðÒ»¸öWebÄ£¿éºó£¬ÔÚä¯ÀÀÆ÷Éϵã»÷ˢа´Å¥(²»ÖØÆôÓ¦ÓóÌÐò)£¬Õâ¸öWebÄ£¿éËæ¼´³öÏÖÔÚ½çÃæÉÏ¡£
¿ª·¢¹¤¾ß
ÔÚ±¾ÎÄÖÐÎÒ½«Ê¹ÓÃÈçϵÄһЩ¹¤¾ßÀ´¹¹Öþ¿ª·¢»·¾³£¬ÆäÖУ¬¸ù¾Ý¸öÈ˵ÄʹÓÃϰ¹ß£¬ÄãÒ²¿ÉÄÜʹÓÃNetBeans»òIntelliJ
IDEA¡£
1.JavaSE7
2.Maven 3.0.4
3.Eclipse Kepler
Ó¦ÓóÌÐò¼Ü¹¹
ÏÂÃæÏêϸµØËµÃ÷Ò»ÏÂͼ4£¬

1.½«Òª´´½¨µÄÓ¦ÓóÌÐò·Ö³ÉWebǰ¶Ë£¬´æ·ÅÄ£¿é½Ó¿ÚµÄCore£¬ÒÔ¼°ÊµÏÖÄ£¿é½Ó¿ÚµÄ¸÷¸öÄ£¿é¡£Webǰ¶Ë²ÉÓÃJSF
2+CDI£¬Ò²¾ÍÊÇʹÓÃJavaEE CDI BeanÓëJSFÒ³Ãæ½øÐа󶨡£Ó¦ÓóÌÐòµÄÿ¸öWebÄ£¿é¶¼ÐèҪʵÏÖCoreÖеÄÄ£¿é½Ó¿Ú¡£
2.Webǰ¶ËÒÔWAB·½Ê½´ò°ü£¬CoreºÍÿ¸öÄ£¿é´ò°ü³É±ê×¼OSGi Bundle¡£
3.ÿ¸öÄ£¿éÓÐÒ»¸öOSGi Activator£¬Ò»µ©²¿ÊðÄ£¿éµ½GlassFish
OSGiÔËÐÐʱ£¬½«Ê×ÏÈÖ´ÐÐÄ£¿éµÄActivator·½·¨À´×¢²áÄ£¿é·þÎñÒÔ±ãÈÃWebǰ¶ËµÄ·þÎñÕìÌýÆ÷Äܹ»»ñÈ¡µ½ÏàÓ¦µÄÄ£¿é·þÎñ¡£
4.Ò»µ©Webǰ¶ËµÄ·þÎñÕìÌýÆ÷(ServiceListener)·¢ÏÖÓÐеÄÄ£¿é±»×¢²á£¬ÄÇô¸ÃÄ£¿é½«±»Ìí¼Óµ½Ó¦ÓóÌÐòBeanµÄÄ£¿é¼¯ºÏÖУ¬ÀàËÆµÄ£¬Ò»µ©·¢ÏÖ¼ÈÓеÄÄ£¿é´ÓOSGi·þÎñ×¢²á±íÖÐɾ³ý£¬ÄÇôӦÓóÌÐòBeanµÄÄ£¿é¼¯ºÏ½«ÒƳý¸ÃÄ£¿é¡£
¹¹Öþ¿ª·¢»·¾³À´´´½¨Ó¦ÓóÌÐò
ÎÒÃǽ«Ê¹ÓÃMavenÀ´Ò»²½Ò»²½µØ´´½¨Ò»¸ö¶àÄ£¿éµÄ¹¤³Ì£¬ÎÒÍÆ¼öʹÓÃÈçϵķ½Ê½À´´´½¨¶àÄ£¿éµÄ¹¤³Ì£¬¹ØÓÚÕâÖÖ·½Ê½µÄÏêϸ˵Ã÷£¬ÄãÄܹ»²Î¿¼¡£
¼ÙÉèÎÒʹÓÃWindowsƽ̨À´´´½¨SampleÓ¦ÓóÌÐò¡£
1.´´½¨SampleÓ¦ÓóÌÐòµÄParent PomÎļþ
ÔËÐÐWindowsÃüÁîÐУ¬ÔÚµ±Ç°µÄ¹¤×÷Ŀ¼Ï£¬Ö´ÐÐÒÔÏÂÃüÁî:
mvn archetype:create -DgroupId=cn.fujitsu.com.tangyong
-DartifactId=glassfish.wab.sample -DarchetypeArtifactId=maven-archetype-site-simple
³É¹¦Ö´Ðкó£¬Äã»á·¢ÏÖÔÚµ±Ç°¹¤×÷Ŀ¼Ï´´½¨ÁËÒ»¸ö¡°glassfish.wab.sample¡°Ä¿Â¼£¬²¢ÇÒÓÐÒ»¸öpom.xmlÎļþ£¬Õâ¸öÎļþ¾ÍÊÇSampleÓ¦ÓóÌÐòµÄParent
PomÎļþ¡£
2.ÅäÖÃSampleÓ¦ÓóÌÐòµÄParent PomÎļþ
´ò¿ªSampleÓ¦ÓóÌÐòµÄParent PomÎļþ£¬·ÅÈëÒÔϵÄÄÚÈÝ£¬
<build> <finalName>${project.artifactId}</finalName> <pluginManagement> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <!-- 2.2.0 and above have new bnd which has wab instruction. 2.3.4 has few important bug fixes. --> <version>2.3.4</version> <extensions>true</extensions> <configuration> <supportedProjectTypes> <supportedProjectType>ejb</supportedProjectType> <supportedProjectType>war</supportedProjectType> <supportedProjectType>bundle</supportedProjectType> <supportedProjectType>jar</supportedProjectType> </supportedProjectTypes> <instructions> <!-- Read all OSGi configuration info from this optional file --> <_include>-osgi.properties</_include> <!-- No packages are exported by default. Having any pattern is dangerous, as the plugin will add any package found in dependency chain that matches the pattern as well. Since there is no easy way to have an include filter for just local packages, we don't export anything by default.--> <Export-Package>!*</Export-Package> </instructions> </configuration> ¡ </plugin> ¡ </plugins> </build> <dependencyManagement> <dependencies> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> <version>4.2.0</version> <scope>provided</scope> </dependency> ¡ </dependencies> </dependencyManagement> <dependencies> <!-- Add the the following dependencies to every module to save user from adding them to every one. --> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> </dependency> ¡ </dependencies> |
ÒÔÉÏÄÚÈÝ»ùÓÚhttps://svn.java.net/svn/glassfish~svn/trunk/fighterfish/sample/parent-pom/pom.xml
£¬ÍêÕûµÄPOMÎļþÄÚÈÝ£¬Çë²ÎÕÕhttps://github.com/tangyong/GlassFishOSGiJavaEESample/blob/master/glassfish.wab.sample
/pom.xml¡£
ÄãÒ»¶¨»áÎÊ£¬ÎªÊ²Ã´Òª·ÅÈëÕâЩÄÚÈÝ£¿ÒÔÏÂÊǼ¸¸öÖØÒªµÄÔÒò:
1.Maven¹¤³ÌµÄPOMÎļþÓкܺõļ̳йØÏµ£¬¾ÍÏñÃæÏò¶ÔÏóµÄÀàÉè¼ÆÒ»Ñù£¬½«×Ó¹¤³ÌÐèÒªµÄһЩ¹²Í¨²å¼þ(plugin)ºÍ¹²Í¨µÄÒÀÀµ(dependency)·ÅÈëµ½Parent
POMÎļþÖÐ×ÜÊǺܺõÄ×ö·¨¡£
2.ΪÁ˹¹½¨WAB£¬ÎÒÃÇ·ÅÈëmaven-bundle-plugin[5]£¬maven-war-plugin[6]ÒÔ¼°ÎªÁ˱àÒëJavaÔ´ÎļþËùÐèÒªµÄmaven-compiler-plugin[7]µÈ¡£ÕâÀÐèҪ˵һÏÂmaven-bundle-plugin£¬Õâ¸ö²å¼þµÄÄ¿µÄÊǽ«¹¤³Ì´ò°ü³É±ê×¼OSGi
BundleµÄÎļþ¸ñʽ£¬ÆäÄÚ²¿Ê¹ÓÃÁËbnd[8]£¬bndÊÇÓÉOSGiÁªÃËǰÖ÷ϯPeter Kriens´´½¨£¬ÓÃÀ´¼ò»¯¿ª·¢OSGi
BundleµÄÍ´¿à¡£´ÓÉÏÃæµÄmaven-bundle-pluginµÄÅäÖÿ´£¬ÓÐÒ»¸öµØ·½ÐèÒªÌØ±ð˵Ã÷:
<instructions> <_include>-osgi.properties</_include>
<Export-Package>!*</Export-Package>
</instructions> |
ÉÏÊöµÄÖ¸ÁîÖУ¬Í¨¹ý¡°_include¡±±êǩָ¶¨ÁËÒ»¸öÅäÖÃOSGiÔªÊý¾ÝµÄÎı¾Îļþ£¬Õâ¸öÎı¾ÎļþµÄλÖÃÏà¶ÔÓÚµ±Ç°Maven¹¤³ÌµÄ¸ùĿ¼(ÄãÒ²¿ÉÒÔ×ÔÐÐÅäÖÃËüµÄλÖÃ)£¬osgi.propertiesÖеÄÄÚÈÝÊÇÒ»×éÖ¸¶¨OSGiÔªÊý¾ÝµÄ¹æÔò£¬ÒÔÏÂÊÇÒ»¸öosgi.propertiesµÄʾÀý:
Export-Package: \ sample.foo; \ sample.bar; version=${project.version} Import-Package: \ sample.car;resolution:=optional, \ * Bundle-SymbolicName: \ ${project.groupId}.${project.artifactId} ¡ |
¹ØÓÚÏêϸµÄÖ¸¶¨¹æÔò£¬Çë²Î¼û[9]¡£
ÕâÀïÒ²ÒªÌØ±ð˵Ã÷һϣ¬ÎÒÃÇʹÓÃMaven War²å¼þµÄ2.4°æ±¾¶ø²»ÊÇ2.1°æ±¾£¬ÒòΪ2.1°æ±¾ÔÚWindowsƽ̨ÉÏ´ò°üʱ£¬»áÉú³ÉÁ½¸öweb.xmlÎļþ¡£Õâ¸öÎÊÌâͬÑù³öÏÖÔÚfighterfish×Ó¹¤³ÌµÄSample
Parent POMÖУ¬ÎÒ½«ºÜ¿ìÐÞ¸´Ëü¡£
Export-Package
ÔÚÉÏÃæµÄmaven-bundle-pluginµÄÅäÖÃÖУ¬»¹³öÏÖÁË<Export-Package>!*</Export-Package>£¬Õâ¸ö±êÇ©ÒÔ¼°±êǩֵµÄº¬ÒåÊÇ£¬Ä¬Èϵأ¬Õâ¸öOSGi
Bundle²»µ¼³öÈκΰü£¬³ý·ÇÎÒÃÇÏÔʾµØÔÚosgi.propertiesÖÐÖ¸¶¨¡°Export-Package¡±Öµ¡£
3.´´½¨Core×Ó¹¤³Ì
´ÓWindowsÃüÁîÐнøÈë¡°assfish.wab.sample¡°Ä¿Â¼£¬Ö´ÐÐÒÔÏÂÃüÁî:
mvn archetype:create -DgroupId=cn.fujitsu.com.tangyong
-DartifactId=glassfish.wab.sample.core
³É¹¦Ö´Ðкó£¬Äã»á·¢ÏÖÔÚ¡°glassfish.wab.sample¡°Ä¿Â¼Ï´´½¨ÁËÒ»¸ö¡°glassfish.wab.sample.core¡°Ä¿Â¼£¬½øÈë¡°glassfish.wab.sample.core¡°Ä¿Â¼²¢´ò¿ªpom.xmlÎļþ£¬Äã»á·¢ÏÖÒÔÏÂÄÚÈÝÒѾ×Ô¶¯±»Ìí¼ÓÁË¡£
<parent> <groupId>cn.fujitsu.com.tangyong</groupId> <artifactId>glassfish.wab.sample</artifactId> <version>1.0-SNAPSHOT</version> </parent> |
È»ºó£¬ÔÚ¡°glassfish.wab.sample.core¡°Ä¿Â¼Ï´´½¨Ò»¸öosgi.propertiesÎļþ£¬ÄÚÈÝÈçÏÂ:
Export-Package={local-packages}; version=${project.version} |
ÕâÑùµÄ»°£¬µ±¹¹½¨×îÖÕBundleʱ£¬Bundle½«µ¼³öÄÚ²¿µÄ´øÓй¤³Ì°æ±¾µÄ°ü¡£
4.´´½¨Web¿Í»§¶Ë×Ó¹¤³Ì
ÀàËÆ3£¬Ö´ÐÐÒÔÏÂÃüÁî:
mvn archetype:create -DgroupId=cn.fujitsu.com.tangyong -DartifactId=glassfish .wab.sample.web -DarchetypeArtifactId=maven-archetype-webapp |
³É¹¦Ö´Ðкó£¬Äã»á·¢ÏÖÔÚ¡°glassfish.wab.sample¡°Ä¿Â¼Ï´´½¨ÁËÒ»¸ö¡°glassfish.wab.sample.web¡°Ä¿Â¼¡£È»ºó£¬Ð½¨src/main/javaºÍsrc/main/resources/META-INFĿ¼¡£Ä¬Èϵأ¬ÕâÁ½¸öĿ¼²»»á±»´´½¨¡£
½Ó×Å£¬ÔÚ¡°glassfish.wab.sample.web¡°Ä¿Â¼Ï´´½¨Ò»¸öosgi.propertiesÎļþ£¬ÄÚÈÝÈçÏÂ:
Web-ContextPath:/wabsample |
ÎÒÖ¸¶¨ÁËÕâ¸öWABµÄWebÉÏÏÂÎÄ·¾¶Îª/wabsample£¬ÄãÒ²¿ÉÒÔ×ÔÐÐÐÞ¸ÄΪÆäËûµÄÖµ¡£
5.´´½¨WEBÄ£¿é1×Ó¹¤³Ì
ÀàËÆ4£¬Ö´ÐÐÒÔÏÂÃüÁî:
mvn archetype:create -DgroupId=cn.fujitsu.com.tangyong -DartifactId=glassfish .wab.sample.module1 -DarchetypeArtifactId=maven-archetype-webapp |
³É¹¦Ö´Ðкó£¬Äã»á·¢ÏÖÔÚ¡°glassfish.wab.sample¡°Ä¿Â¼Ï´´½¨ÁËÒ»¸ö¡°glassfish.wab.sample.module1¡°Ä¿Â¼¡£
È»ºó£¬´ò¿ª¸Ã¹¤³ÌµÄpomÎļþ£¬Ìí¼Ó¡°glassfish.wab.sample.core¡°ÒÀÀµÉùÃ÷£¬
<dependency> <groupId>cn.fujitsu.com.tangyong</groupId> <artifactId>glassfish.wab.sample.core</artifactId> <version>1.0-SNAPSHOT</version> </dependency> |
6.´´½¨WEBÄ£¿é2×Ó¹¤³Ì
ÀàËÆ5£¬ÕâÀï¾ÍÌø¹ý¡£
7.ÉèÖÿª·¢»·¾³
Ò»µ©ÕâЩMaven×Ó¹¤³Ì¹¤³Ì´´½¨³É¹¦£¬ÎÒÃǽ«½øÐпª·¢»·¾³µÄÉèÖ㬽øÈë±àÂë½×¶Î£¬ÒÔϵIJ½ÖèÃèÊöÁËÈçºÎ½«Maven¼¯³Éµ½Eclipse¡£¼Ù¶¨ÎÒµÄEclipse¹¤×÷¿Õ¼ä(Workspace)ÊÇ¡°E:\QCON\WS¡°¡£
ÐÞ¸ÄKeplerÖеÄM2_REPO±äÁ¿
ÐÞ¸ÄKeplerÖеÄM2_REPO±äÁ¿µÄÄ¿µÄÊÇΪÁËÉèÖÃM2_REPOµÄֵΪÄã»úÆ÷ÉϵÄMaven±¾µØ²Ö¿â(Local
Repository)¡£Ä¬Èϵأ¬KeplerÖеÄM2_REPO±äÁ¿µÄֵΪ~/.m2/repository¡£¾ßÌåµÄÐ޸IJ½Öè¿ÉÒÔ²ÎÕÕ[10]¡£
ΪMaven¹¤³Ì´´½¨EclipseÏà¹ØµÄÎļþ(Èç,.projectÎļþ)
´ÓWindowsÃüÁîÐнøÈë¡°glassfish.wab.sample¡°Ä¿Â¼£¬Ö´ÐÐÒÔÏÂÃüÁî:
mvn eclipse:eclipse
È»ºó½«¡°glassfish.wab.sample¡°¹¤³ÌÁ¬Í¬×Ó¹¤³Ìµ¼Èëµ½EclipseÖС£Èç¹ûÒ»Çгɹ¦µÄ»°£¬ÔÚEclipseÖУ¬Ó¦¸Ã¿´µ½ÀàËÆÈçÏÂµÄ»Ãæ¡£

ͼ5: ³É¹¦µ¼Èëµ½EclipseµÄSampleÓ¦ÓóÌÐò½á¹¹Ê¾Òâͼ
Ó¦ÓóÌÐòºËÐÄÂß¼
1.glassfish.wab.sample.core
н¨Ò»¸öÃûΪ¡°Module¡°µÄ½Ó¿Ú, ¸Ã½Ó¿ÚµÄ¶¨ÒåÈçÏÂ:
public interface Module { public String getModuleName(); public URL getResource(String path); public String getAboutPage(); } |
2.glassfish.wab.sample.web
Web×Ó¹¤³ÌµÄºËÐÄÊÇApplicationBeanÀ࣬ÕâÒ²ÊÇÒ»¸öCDI Bean£¬²¢ÇÒºÍJSFÒ³Ãæ°ó¶¨ÔÚÒ»Æð£¬³ÉΪÁËJSFÍйÜBean£¨Managed
Bean£©¡£ÒÔÏÂÊÇhome.xhtmlÒ³ÃæÖÐÓëApplicationBeanÏà¹ØµÄÄÚÈÝ£¬
<h:body> <h:panelGroup layout="block" rendered="#{not empty applicationBean.modules}"> Modules: <br/> <ui:repeat value="#{applicationBean.modules}" var="module"> <h:panelGrid columns="1"> <h:link outcome="#{module.moduleName}#{module.aboutPage}" value="# {module.moduleName}" /> </h:panelGrid> </ui:repeat> </h:panelGroup> <h:panelGroup layout="block" rendered="#{empty applicationBean.modules}"> No modules available. </h:panelGroup> </h:body> |
ÆäÖУ¬#{applicationBean.modules}ÊÇJSF±í´ïʽÓïÑÔ£¬Í¨¹ýÕâ¸ö±í´ïʽ£¬Äܹ»»ñÈ¡µ½ApplicationBeanÀàʵÀýÖеÄmodules±äÁ¿µÄÖµ¡£ÔÚÉè¼ÆÕâ¸öÒ³ÃæÊ±£¬ÎÒÃÇͨ¹ý<ui:repeat>±êÇ©¶¯Ì¬µØ×·¼Ó<h:panelGrid>£¬Ò»µ©ÓÐеÄÄ£¿éµ½À´»òÕß¼ÈÓÐÄ£¿é±»ÒƳý£¬ApplicationBeanÀàʵÀýÖеÄmodules±äÁ¿µÄÖµ½«·¢Éú¸Ä±ä£¬È»ºó£¬µ±Ë¢ÐÂä¯ÀÀÆ÷ʱ£¬JSFÒ³Ãæ½«³ÊÏÖ³ö²»Í¬µÄÄÚÈÝ¡£
ÄÇô£¬ApplicationBeanÀàʵÀýÊÇÈçºÎ¸ú×Ùµ½Ä£¿éµÄ×¢²áºÍÒÆ³ýµÄÄØ£¿Ê×ÏÈ£¬ÈÃÎÒÃÇ¿´Ò»ÏÂApplicationBeanÀàµÄ¶¨Òå:
@Named @ApplicationScoped public class ApplicationBean {
@Inject
private BundleContext bc;
@Inject
private ModuleListener moduleListener;
private List<Module> modules = new ArrayList<Module>();
@Inject
public void initialize(ServiceTracker st) {
bc.addServiceListener(moduleListener);
loadServices(st);
}
public void afterAddModule(Module module) {
System.out.println("Module added.");
modules.add(module);
}
public void beforeRemoveModule(Module module)
{
System.out.println("Module removed");
modules.remove(module);
}
public List<Module> getModules() {
return modules;
}
private void loadServices(ServiceTracker st)
{
ServiceReference[] srs = st.getServiceReferences();
if (srs != null) {
for (ServiceReference sr : srs) {
Module m = (Module) bc.getService(sr);
modules.add(m);
}
}
}
} |
ÒÔÉ϶¨ÒåÖУ¬moduleListener°çÑÝÁËÖØÒªµÄ×÷Óã¬moduleListenerÊÇorg.osgi.framework.ServiceListenerµÄÒ»¸öʵÏÖ£¬ServiceListenerµÄ×÷ÓÃÊÇÓÃÀ´¸ú×ÙOSGi·þÎñµÄ×¢²á£¬¸üÐÂÒÔ¼°Ð¶ÔØ¡£afterAddModule
ºÍbeforeRemoveModule×÷Ϊ»Øµ÷·½·¨±»moduleListenerµ÷Ó㬾ßÌ嵨£¬moduleListenerÖÐ×¢ÈëÁËApplicationBeanʵÀý£¬Ò»µ©ÓÐеÄÄ£¿éµ½À´£¬moduleListener¾Í»áͨ¹ýApplicationBeanʵÀýÀ´µ÷ÓÃafterAddModule·½·¨£¬Èç¹û¼ÈÓеÄÄ£¿é±»ÒƳý£¬ÄÇô¾Íµ÷ÓÃbeforeRemoveModule·½·¨¡£
ÔÚglassfish.wab.sample.webÖл¹ÓÐһЩÆäËûµÄÀ࣬ÒòΪƪ·ù¹ØÏµ£¬¾Í²»Ò»Ò»ÐðÊöÁË¡£
1.glassfish.wab.sample.module1
Ä£¿é1ºÜ¼òµ¥£¬Ö»ÓÐÁ½¸öÀ࣬ʵÏÖModule½Ó¿ÚµÄModule1ÀàºÍBundleActivatorµÄʵÏÖÀàActivator¡£ÎÒÃDZØÐëҪ׷¼ÓÒ»¸öBundleActivatorµÄʵÏÖÀàÒÔ±ãÄ£¿é1ÔÚÆô¶¯Ê±Äܹ»½«×Ô¼º×¢²áµ½GlassFish
OSGiÔËÐÐʱµÄ·þÎñ×¢²á±íÖС£
ÏêϸµÄÄÚÈÝÇë²Î¼û: https://github.com/tangyong/GlassFishOSGiJavaEESample/tree/master
/glassfish.wab.sample/glassfish.wab.sample.module1
2.glassfish.wab.sample.module2
ÀàËÆÓÚÄ£¿é1£¬ÕâÀï¾ÍÊ¡ÂÔÌø¹ý¡£
ÍêÕûµÄSampleÓ¦ÓóÌÐò£¬Çë´Óhttps://github.com/tangyong/GlassFishOSGiJavaEESample
ÖÐÏÂÔØ¡£
ʹÓÃGlassFish 4²¿ÊðOSGi WEBÓ¦ÓóÌÐò
Ò»µ©ÎÒÃǹ¹½¨ÍêSampleÓ¦ÓóÌÐò£¬¾Í½«Ê¹ÓÃGlassFish 4À´²¿ÊðËü¡£
°²×°ºÍÆô¶¯GlassFish
Ê×ÏÈ£¬ÄãÐèÒª´ÓÒÔÏÂÁ´½ÓÏÂÔØÒ»¸öGlassFish 4µÄ°²×°zip°ü¡£È»ºó½âѹËõÕâ¸özip°üµ½±¾µØµÄÎļþϵͳ¡£
http://download.java.net/glassfish/4.0/release/glassfish-4.0.zip
È»ºó£¬Í¨¹ýÒÔÏÂÃüÁÆô¶¯GlassFishµÄdomain£¬Ä¬Èϵأ¬GlassFish»áΪÄã´´½¨ºÃÒ»¸ödomain¡£¼ÙÉè½âѹËõºóµÄGlassFishËùÔÚµÄĿ¼ÓÃ$GlassFish_HOME±íʾ£¬
cd $GlassFish_HOME/glassfish4/glassfish/bin asadmin start-domain |
¸ü¶àµÄ¹ØÓÚGlassFish 4µÄÎĵµ£¬Çë²Î¿¼: http://glassfish.java.net/documentation.html
²¿ÊðOSGiÓ¦ÓóÌÐòµÄ·½Ê½
»ù±¾ÉÏ£¬Ê¹ÓÃGlassFish 4²¿ÊðOSGiÓ¦ÓóÌÐòÓÐÈýÖÖ·½Ê½£¬
1.ʹÓÃasadmin deployÃüÁî
ÔÚÃüÁîÐлòÕßShellÖУ¬Ê¹ÓÃÀàËÆÈçϵÄÃüÁî,
asadmin deploy ¨Ctype=osgi XXX.jar»òXXX.war |
µ±²¿ÊðWABʱ£¬¾³£ÈÝÒ×ÒÅ©¡ªtype=osgi£¬Èç¹ûÒÅ©Õâ¸öÑ¡ÏÄÇôÄãËù×öµÄ¾ÍÊÇÔÚ²¿ÊðÒ»¸ö±ê×¼µÄWAR¶ø²»ÊÇWAB¡£
2.ʹÓÃautodeployµÄ·½Ê½
ÕâÊÇÒ»¸ö·Ç³£¿ì½ÝµÄ²¿Êð·½Ê½£¬ÄãÖ»ÐèÒª½«Òª²¿ÊðµÄBundle·Åµ½$GlassFish_HOME/glassfish4/glassfish/domains/domain1/autodeploy/bundlesĿ¼Ï¾ͿÉÒÔÁË¡£ÕâÖÖ·½Ê½Êǽ«Apache
Felix File Install[11]¼¯³Éµ½GlassFishÖУ¬Ê¹ÓÃÕâÖÖ·½Ê½ÉõÖÁÄܹ»¿¼ÂÇBundleÖ®¼äµÄÒÀÀµ¡£ÏêϸµØÄÚÈÝ£¬Çë¿´Ò»ÏÂ[12]¡£
3.ʹÓÃasadmin osgiÃüÁî
GlassFish 3ÔÊÐíÄãͨ¹ýtelnetµÇ½µ½GlassFish OSGiÔËÐÐʱµÄºǫ́£¬È»ºóͨ¹ýÒÔϵķ½Ê½À´°²×°²¢Æô¶¯Ò»¸öWAB£¬
install webbundle:file:///tmp/mybundle.war start <bundle_id> |
µ«ÊÇ£¬µ½ÁËGlassFish 4£¬ÕâÖÖtelnetµÄ·½Ê½ÒѾ±»½ûÖ¹ÁË£¬ÔÒòÊÇtelnetµÄ·½Ê½²¢²»°²È«£¬Òò´Ë£¬GlassFish
4ÌṩÁËÒ»ÖÖеķ½Ê½È¥Ö±½Ó²Ù×÷OSGiÔËÐÐʱ£¬¼´Í¨¹ýÖ´ÐÐasadmin osgi ...ÃüÁÀýÈ磬ÉÏÃæµÄÃüÁîµÈͬÓÚÒÔÏ£¬
asadmin osgi install file:///tmp/mybundle.war asadmin osgi start <bundle_id> |
¶ÔÓÚasadmin osgiÃüÁ×î³£ÓõľÍÊÇ£¬µ±Ä㲿ÊðÍêÒ»¸öOSGi Bundle»òÕßÏë¿´Ò»ÏÂijЩBundleµÄId»òÕßµ±Ç°×´Ì¬Ê±£¬Ê¹ÓÃasadmin
osgi lbÃüÁîÄܹ»ÁоٳöOSGiÔËÐÐʱÖÐËùÓеÄBundle¡£
¶ÔÓÚÕâÈýÖÖ·½Ê½£¬ÎÒ¸ü¼ÓÇãÏòÓÚʹÓá°Ê¹ÓÃautodeployµÄ·½Ê½¡°£¬ÒòΪËü¸ü¼Ó¼òµ¥£¬¸üÓÐЧÂÊ¡£¶ÔÓÚ¡°Ê¹ÓÃasadmin
deployÃüÁ£¬¾ø´ó¶àÊý³¡ºÏ£¬Ö´ÐеÄЧÂÊÒ²ºÜºÃ£¬µ«ÊÇ£¬µ±ÄãµÄ³ÌÐòʹÓÃvaadinʱ£¬²¿Ê𽫻á·Ç³£Âý£¬ÕâÊÇGlassFishÐèÒª¼±Ðè¸Ä½øµÄÒ»¸öÌØÐÔ£¬ÏàÐźܿ콫»áµÃµ½¸ÄÉÆ¡£
²¿Êð²¢ÔËÐÐSampleÓ¦ÓóÌÐò
ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔ°´ÕÕÈçϵÄ˳Ðò²¿Êð²¢ÔËÐÐSampleÓ¦ÓóÌÐòÁË£¬
1.²¿Êðglassfish.wab.sample.core
Ö´ÐС°asadmin deploy ¨Ctype=osgi glassfish.wab.sample.core.jar¡±
2.²¿Êðglassfish.wab.sample.web.war
Ö´ÐС°asadmin deploy ¨Ctype=osgi glassfish.wab.sample.web.war¡°
ÔÚä¯ÀÀÆ÷ÉϼüÈë¡°http://localhost:8080/wabsample/¡°£¬Ó¦¸ÃûÓгöÏÖÈκÎÄ£¿é£¬ÈçÏÂͼËùʾ£¬

3.²¿Êðglassfish.wab.sample.module1ºÍglassfish.wab.sample.module2
Ö´ÐС°asadmin deploy ¨Ctype=osgi glassfish.wab.sample.module1.war¡°
ÒÔ¼°¡±asadmin deploy ¨Ctype=osgi glassfish.wab.sample.module2.war¡°
5.ÔÚä¯ÀÀÆ÷Éϵã»÷ˢа´Å¥£¬´Ëʱ£¬Ä£¿é1ºÍÄ£¿é2¶¼³öÏÖÁË£¬ÈçÏÂͼËùʾ£¬

È»ºó£¬ÔÙÖ´ÐС°asadmin osgi lb¡°ÃüÁһϸոÕÎÒÃDz¿ÊðµÄBundleµÄ״̬£¬

6.Ö´ÐÐÒÔÏÂÃüÁîÐ¶ÔØÄ£¿é2
¡°asadmin undeploy glassfish.wab.sample.module2¡°
7.È»ºó£¬ÔÚä¯ÀÀÆ÷ÉÏÔٴεã»÷ˢа´Å¥£¬´Ëʱ£¬Ä£¿é2ÒѾÏûʧÁË£¬ÈçÏÂͼËùʾ£¬
ÆÊÎöGlassFish OSGi/WEBÈÝÆ÷
µ½ÕâÀïΪֹ£¬Èç¹ûÄã×ÐϸÔĶÁÉÏÃæµÄÄÚÈÝ£¬ÎÒÏëÄãÓ¦¸ÃÒÑ¾ÕÆÎÕÁËÈçºÎ¿ª·¢ºÍ²¿ÊðÒ»¸öWAB£¬²¢ÇÒÒ²Ó¦¸ÃÀí½âÁËWABºÍ±ê×¼OSGi
BundleÒÔ¼°ºÍ±ê×¼WARµÄÇø±ð¡£ÈÃÎÒÃÇÔÙÉîÈëһϣ¬¿´¿´GlassFishÊÇÈçºÎʵÏÖOSGi WEBÓ¦ÓóÌÐò¹æ·¶µÄ¡£
»ìºÏÓ¦ÓóÌÐòBundle(Hybrid Application Bundle)
´ÓGlassFishµÄ½Ç¶È¿´£¬WABÓÖÊÇ»ìºÏÓ¦ÓóÌÐòBundleµÄÒ»ÖÖÀàÐÍ¡£»ìºÏÓ¦ÓóÌÐòBundle¼ÈÊÇÒ»¸ö±ê×¼OSGi
Bundle£¬ÓÖÊÇÒ»¸öJavaEEÄ£¿é¡£ÔÚÔËÐÐʱ£¬Ëü¼ÈÓÐÒ»¸öOSGi BundleÉÏÏÂÎÄ£¬ÓÖÓÐÒ»¸öJavaEEÉÏÏÂÎÄ¡£Ä¿Ç°£¬GlassFishÖ§³ÖÁ½ÖÖÀàÐ͵ĻìºÏÓ¦ÓóÌÐòBundle£¬WebÓ¦ÓóÌÐòBundleºÍEJBÓ¦ÓóÌÐòBundle¡£¹ØÓÚEJBÓ¦ÓóÌÐòBundle£¬ÎÒ½«·ÅÔÚPart3ÖС£
µ±Ò»¸ö»ìºÏÓ¦ÓóÌÐòBundle±»²¿Êðµ½GlassFish OSGiÔËÐÐʱ£¬GlassFishÄܹ»¹Û²ìµ½ËüµÄÉúÃüÖÜÆÚ£¬Ê¹ÓÃÊìÖªµÄ¡°Extenderģʽ[13]¡°£¬½«BundleÖеÄһЩ²¿·Ö²¿Êð»òUndeployµ½JavaEEÈÝÆ÷ÖС£»ìºÏÓ¦ÓóÌÐòBundleµÄÉúÃüÖÜÆÚÈçÏÂËùʾ,

ͼ6: »ìºÏÓ¦ÓóÌÐòBundleµÄÉúÃüÖÜÆÚ
Èç¹ûÄã×Ðϸ¿´Ò»ÏÂͼ6ºÍͼ1£¬±¾ÖÊÉÏÁ½·ùͼÊÇÒ»ÑùµÄ£¬Í¼6²¢Ã»ÓÐÔÚOSGiÉúÃüÖÜÆÚµÄ»ù±¾×´Ì¬ÉÏÔö¼Ó4¸ö²¿ÊðºÍUndeployÏà¹ØµÄ״̬£¬µ«ÊÇ£¬Í¼1ÖеÄ4¸ö״̬ËùÉæ¼°µÄ²Ù×÷¶¼·´Ó³µ½ÁËͼ6ÖС£
GlassFish OSGi WebÈÝÆ÷µÄʵÏÖ
GlassFish OSGi WebÈÝÆ÷ʵÏÖÁËOSGi WebÓ¦ÓóÌÐò¹æ·¶¡£Í¨¹ý²¿ÊðWAB£¬ÎÒÃÇÄܹ»ÇåÎúµØÀí½âGlassFish²¿ÊðOSGi
WebÓ¦ÓóÌÐòµÄÁ÷³ÌÒÔ¼°ÈçºÎʵÏֹ淶µÄ¡£²¿ÊðÁ÷³Ì·ÖΪÁ½¸ö½×¶Î£¬
1.ºÍ²¿Êð±ê×¼OSGi BundleÒ»Ñù£¬²¿ÊðWABµ½OSGiÔËÐÐʱÖС£
2.µ±WABµÄÉúÃüÖÜÆÚ±äΪACTIVE״̬»òÕßSTARTING״̬(ÒòΪÓÐÒ»¸öÀÁ¶èµÄ¼¤»î²ßÂÔ)ʱ£¬²¿Êð¸ÃWABµ½JavaEEÔËÐÐʱÖС£
ÐèҪעÒâµÄÊÇ£¬1ºÍ2ÊÇÒì²½µÄ£¬ÕâÓëUndeploy¹ý³Ì²»Í¬£¬UndeployÊÇͬ²½µÄ£¬Ò²¾ÍÊÇ˵£¬Ò»µ©¸ÃWAB±»Í£Ö¹»òÐ¶ÔØ£¬½«Á¢¼´´ÓJavaEEÔËÐÐʱÖÐUndeploy¸ÃWAB£¬²¢ÇÒÇåÀíÏàÓ¦µÄ×ÊÔ´¡£
ÒÔÏ£¬ÎÒ½«Ê¹Óá°asadmin deployÃüÁÀ´ÆÊÎö²¿ÊðµÄÁ÷³Ì¡£
¡¾½×¶Î1¡¿²¿ÊðWABµ½OSGiÔËÐÐʱ
½×¶Î1µÄ²¿ÊðÖ÷Òª°üÀ¨Á½¸ö²¿·Ö: a.°²×°WABµ½OSGiÔËÐÐʱ b.Æô¶¯¸ÃWABʹÆä´¦ÓÚACTIVE״̬»òÕßSTARTING״̬¡£
ÒÔÏÂÊDz¿ÊðWABµ½OSGiÔËÐÐʱµÄʱÐòͼ£¬

ͼ7: ²¿ÊðWABµ½OSGiÔËÐÐʱµÄʱÐòͼ
1.¸ù¾Ý²¿ÊðµÄÀàÐÍ£¬ApplicationLifecycleÀà»ñÈ¡ÏàÓ¦µÄAchiveHandler¡£ÒòΪÎÒÃÇÕýÔÚ²¿ÊðWAB£¬µ±Ö´ÐС°asadmin
deploy¡°ÃüÁîʱ£¬ÎÒÃÇ´«µÝÁË¡°¡ªtype=osgi¡±£¬Òò´Ë£¬²¿ÊðµÄÀàÐÍΪosgi¡£»ñÈ¡µ½µÄAchiveHandlerÊÇOSGiArchiveHandler¡£AchiveHandler¸ºÔð´¦ÀíºÍ·ÃÎÊijÖÖÌØ¶¨µµ°¸ÖеÄ×ÊÔ´£¬ÕâЩµµ°¸°üÀ¨ÁËWAR£¬JAR£¬RARÒÔ¼°Bundle¡£AchiveHandler½«ÔÚ¹¹½¨²¿ÊðClassLoader£¬»ñÈ¡SnifferµÈºóÐø¶¯×÷Öб»Ê¹Óõ½¡£
ÁíÍ⣬ApplicationLifecycleÀàÊDz¿ÊðµÄºËÐÄÀ࣬ҲÊDz¿ÊðÃüÁîºËÐÄÂß¼Ö´ÐеÄÈë¿Úµã£¬´ÓËüµÄËùÔÚµÄλÖÃÄܹ»¿´³öËüµÄÖØÒªÐÔ£¬ËüλÓÚGlassFishÄÚºËÄ£¿é¡£
2.½ÓÏÂÀ´£¬ApplicationLifecycleÀàͨ¹ýSnifferManagerImplÀà»ñÈ¡ÏàÓ¦µÄSniffer¡£ÄÇô£¬Ê²Ã´ÊÇSnifferÄØ?×Ô´ÓGlassFish
v3¿ªÊ¼£¬¸ù¾Ý²¿ÊðµÄÇëÇó£¬Sniffer±»ÓÃÀ´·ÖÎöºÍÑ¡ÔñºÏÊʵÄÈÝÆ÷À´´¦ÀíÓ¦ÓóÌÐòµÄÀàÐÍ¡£·ÖÎöºÍÑ¡ÔñµÄ¹ý³Ì¿ÉÄܼòµ¥£¬Ò²¿ÉÄܸ´ÔÓ¡£ÀýÈ磬ͨ¹ý²éÕÒWEB-INF/web.xml»òÕßÊÇ·ñÒÔ.war½áβÀ´·ÖÎöÊÇ·ñÐèÒªWEBÈÝÆ÷£¬Ò²¿ÉÄÜͨ¹ý×¢½â(Annotation)ɨÃèÀ´ÅжÏÊÇ·ñÐèÒªEJBÈÝÆ÷¡£¶ÔÓÚWABµÄÇéÐΣ¬SnifferManagerImpl·µ»ØÁËOSGiSniffer¡£½øÒ»²½µØ£¬Sniffer½Ó¿ÚÓиöÖØÒªµÄ·½·¨½Ð¡°getContainersNames¡±£¬¶ÔÓÚOSGiSniffer£¬Õâ¸ö·½·¨·µ»Ø¡°osgi¡±¡£Õâ¸ö·½·¨½«±»ÓÃÀ´»ñÈ¡ÏàÓ¦µÄÈÝÆ÷¡£
3.ÓÐÁ˾ßÌåµÄSnifferÖ®ºó£¬ApplicationLifecycleÀàͨ¹ýContainerRegistryÀàµÄgetContainer(String
containerType)·½·¨À´»ñÈ¡ÏàÓ¦µÄÈÝÆ÷£¬ÆäÖУ¬containerType¾ÍÊÇ2)ÖÐÌáµ½µÄ¡°getContainersNames¡±µÄ·µ»ØÖµ¡£½øÒ»²½µØ£¬getContainer(String
containerType)·½·¨·µ»ØÁËÒ»¸öEngineInfo¶ÔÏó£¬Õâ¸ö¶ÔÏóÓµÓÐÌØ¶¨ÈÝÆ÷µÄÐÅÏ¢¡£¶ÔÓÚWABÇéÐΣ¬Õâ¸öÌØ¶¨µÄÈÝÆ÷ÊÇOSGiContainer¡£ÒÔÏÂÊÇÒ»¸öµ÷ÊÔµÄÐÅÏ¢£¬¸ø³öÁËEngineInfo¶ÔÏóÖеÄÄÚÈÝ¡£

4.ÆäÖУ¬Äã¿ÉÒÔ·¢ÏÖcontainerµÄÀàÐÍÊÇÒ»¸öServiceHandleImp£¬ÕâÊÇÒ»¸öHK2Ïà¹ØµÄÀ࣬ÒÔÏÂÊÇOSGiContainerµÄ´úÂ룬
@Service(name = OSGiSniffer.CONTAINER_NAME) @Singleton public class OSGiContainer implements Container { public Class<? extends Deployer> getDeployer() { return OSGiDeployer.class; }
public String getName() {
return OSGiSniffer.CONTAINER_NAME; // used for
reporting
purpose,so any string is fine actually
}
} |
¹ØÓÚHK2µÄÄÚÈÝ£¬ÎÒ½«ÔÚPart7ÖÐÏêϸ²ûÊö¡£ÕâÀï¼òµ¥µØËµÒ»Ï£¬Ê×ÏÈ£¬HK2ÊÇÒ»¸öJSR330µÄʵÏÖ¡£Æä´Î£¬OSGiContainerʹÓÃ@ServiceÀ´±ê×¢Õâ¸öÀàÊÇÒ»¸öHK2µÄ·þÎñ£¬²¢ÇÒÓÃnameÊôÐÔÀ´·½±ãHK2½øÐÐÒÀÀµ×¢Èë¡£ÁíÍ⣬ʹÓÃ@SingletonÀ´±ê×¢µ±Ê¹ÓÃHK2»ñÈ¡OSGiContainerʵÀýʱ£¬Ê¹ÓÃSingletonµÄ·½Ê½¡£ÔÙÕߣ¬Õâ¸öÀàÖÐ×îÎªÖØÒªµÄ·½·¨ÊÇgetDeployer£¬¸Ã·½·¨·µ»ØÁËOSGiDeployer£¬ÓÃÓÚºóÐøµÄOSGi²¿Êð¡£
´ÓÒÔÉϵ͍ÒåÄܹ»¿´³ö£¬OSGiContainerµÄʵÀýÓÉHK2¸ºÔð´´½¨²¢²»ÊÇͨ¹ýnew³öÀ´µÄ£¬Òò´Ë£¬EngineInfo¶ÔÏóÖеÄÄÚÈݺÜ×ÔÈ»µØ±ä³ÉÁËServiceHandleImp¡£
5.½ÓÏÂÀ´¾ÍÊÇͨ¹ýEngineInfo¶ÔÏó»ñÈ¡ÏàÓ¦µÄDeployerÁË£¬DeployerÕæÕý¸ºÔð²¿Êð{3)ÖÐÎÒÃÇÒѾ֪µÀ¶ÔÓÚWABÇéÐΣ¬EngineInfo½«·µ»ØOSGiDeployer¡£
6.È»ºó£¬ApplicationLifecycleÀàίÍÐOSGiDeployerÀàÀ´°²×°WABµ½OSGiÔËÐÐʱÖУ¬OSGiDeployer½ø¶øÊ¹ÓÃBundleContextÀ´°²×°¸ÃWAB¡£°²×°³É¹¦ºó£¬¸ÃWABµÄ״̬½«±äΪINSTALLED¡£
7.µ±°²×°³É¹¦ºó£¬ApplicationLifecycleÀ࿪ʼίÍÐOSGiDeployedBundleÀàÀ´Æô¶¯¸ÃWAB£¬µ±È»£¬ÔÚÆô¶¯Ö®Ç°£¬ÐèÒªÊ×ÏÈÅжϸÃBundle²»ÊÇÒ»¸öFragment£¬È»ºóÔÙͨ¹ýBundle.start·½·¨À´Æô¶¯¸ÃWAB¡£
ÉÏÃæÌáµ½µÄSnifferµÈ¸ÅÄÔÚGlassFish Wiki[14]ÖÐÓиüΪÏêϸµØËµÃ÷¡£
¡¾½×¶Î2¡¿²¿ÊðWABµ½JavaEEÔËÐÐʱ
ÔÚ²ûÊö½×¶Î2֮ǰ£¬ÐèÒªÏȻص½GlassFish DomainµÄÆô¶¯£¬Õⲿ·ÖÄÚÈݽ«ÔÚPart8ÖÐÏêϸµØËµÃ÷¡£Ò²ÐíÄã»áÎÊ£¬ÎªÊ²Ã´Òª»Øµ½GlassFish
DomainµÄÆô¶¯£¿
ÔÒòÔÚÓÚ´Ó½×¶Î1¹ý¶Éµ½½×¶Î2£¬ÐèÒª×öһЩ±ØÒªµÄ¹¤×÷£¬ÀýÈç: ÔÚ¡°WABÉúÃüÖÜÆÚ¡±Ò»ÕÂÖУ¬Ìáµ½¹ýΪÁ˲¿ÊðWABµ½JavaEEÔËÐÐʱ£¬Ç°ÌáÌõ¼þÊǵȴýWAB´¦ÓÚACTIVE״̬»òSTARTING״̬£¬ÄÇôÈçºÎµÈ´ý£¿ÔÚOSGi¿ª·¢ÖУ¬Ò»¸ö³£¼ûµÄģʽÊÇʹÓÃBundleTrackerÀàÀ´¸ú×ÙÒѱ»°²×°µÄBundleµÄÉúÃüÖÜÆÚ±ä»¯¡£Í¨³££¬´ò¿ªBundleTrackerµÄ²Ù×÷ÊÇÓÉOSGi
ActivatorÍê³ÉµÄ£¬¶øOSGi Activator(Èç¹ûÓеϰ)ÊÇÆô¶¯OSGi Bundle×îÏÈÖ´Ðеķ½·¨£¬Òò´Ë£¬±ØÐëÓÐÒ»¸öBundle×öÕâÑùµÄBootStrap¶¯×÷¡£GlassFish
OSGi-JavaEE×ñÑÁËÕâÒ»Éè¼ÆÄ£Ê½£¬ËùÒÔ£¬ÎªÁ˸ãÇå³þÄÄЩBundleÔÚÍê³ÉÕâЩBootStrap¶¯×÷£¬ÎÒÃDZØÐë»Øµ½GlassFish
DomainµÄÆô¶¯¡£
GlassFish°²×°Ä¿Â¼ÏÂÓиöĿ¼½Ðglassfish4/glassfish/modules/autostart£¬ÕâÀï·ÅÖÃÁËһЩBundle£¬ÆäÖУ¬ÓÐÁ½¸öBundleÓë±¾ÎÄÃÜÇÐÏà¹Ø:
1) osgi-javaee-base.jar 2) osgi-web-container.jar¡£
Ê×ÏÈ£¬¿´Ò»ÏÂËüÃǵÄ×÷Óã¬osgi-javaee-baseÊÇGlassFish OSGi-JavaEEʵÏֵĻùÀ࣬Ö÷ҪʹÓÃÁËExtenderģʽÀ´¹¹½¨Õû¸öOSGi-JavaEEµÄ¿ò¼Ü£¬ÊÇGlassFish
OSGi-JavaEEʵÏÖµÄÁé»ê¡£osgi-web-containerʵÏÖÁËOSGi Web¹æ·¶£¬Ò²ÊDZ¾ÎÄÖØµãÒªÆÊÎöµÄ¶ÔÏó¡£
Æä´Î£¬osgi-javaee-baseºÍosgi-web-container¶¼¶¨ÒåÁËActivator£¬µ±Æô¶¯GlassFish
Domainºó£¬osgi-javaee-base.jarºÍosgi-web-container.jar±»²¿Êðµ½GlassFish
OSGiÔËÐÐʱÖУ¬ÇÒÕâÁ½¸öBundle¶¼±»¼¤»î´¦ÓÚActive״̬£¬ÔÚµ½´ïActive״̬֮ǰ£¬¸÷×ÔµÄActivator¶¼±»µ÷Óá£ÈÃÎÒÃÇÀ´¿´¿´ËüÃǵÄActivator¶¼×öÁËʲô¡£
osgi-javaee-baseµÄActivator
osgi-javaee-baseµÄActivator½Ð¡°OSGiJavaEEActivator¡±£¬ËüµÄstart·½·¨ÖкËÐĵÄÂß¼ÊÇÆô¶¯ExtenderManager£¬ÒÔ¼°×¢²á²¢Æô¶¯JavaEEExtender¡£ExtenderManagerµÄ×÷ÓÃÊǸºÔðÆô¶¯ÈκÎÒѾ±»×¢²áµÄExtender·þÎñ¡£ÒÔÏÂÊÇÏàÓ¦µÄ´úÂ룬
private synchronized void startExtenders() { //Because of a race condition,we can be started multiple times, so check if already started if (extenderTracker != null) return;
// open will call addingService for each existing
extender
// and there by we will start each extender.
extenderTracker = new ExtenderTracker(context);
extenderTracker.open();
} |
¿ÉÒÔÇå³þµØ¿´µ½£¬Æô¶¯µÄÂß¼Ö÷ÒªÔÚExtenderTrackerÖУ¬ÈÃÎÒÃÇ¿´Ò»ÏÂ
private class ExtenderTracker extends ServiceTracker { ExtenderTracker(BundleContext context) { super(context, Extender.class.getName(), null); } @Override public Object addingService(ServiceReference reference) { Extender e = Extender.class.cast(context.getService (reference)); logger.logp(Level.FINE, "ExtenderManager$ExtenderTracker"," addingService", "Starting extender called {0}", new Object[]{e}); e.start(); return e; } ¡ |
ExtenderTrackerÊÇÒ»¸öServiceTracker£¬ÔÚOSGi¿ª·¢ÖУ¬Ê¹ÓÃServiceTrackerÀ´¸ú×Ù×¢²áµÄOSGi·þÎñÒѾ³ÉΪÁ˾µäµÄģʽ¡£ÕâÀExtenderTracker¸ú×ٵķþÎñÀàÐÍÊÇExtender½Ó¿Ú¡£Ò»µ©Ä³¸öExtender±»×¢²á£¬ÄÇôExtenderTracker½«µ÷ÓÃaddingService·½·¨È»ºóÆô¶¯Õâ¸öExtender¡£
Ç°ÃæÌáµ½£¬³ýÁËÆô¶¯ExtenderManager£¬osgi-javaee-baseÒ²×¢²á²¢Æô¶¯JavaEEExtender£¬Õâ¸öJavaEEExtender·Ç³£ÖØÒª£¬ËüµÄ×÷ÓþÍÊǸºÔðÕìÌýºÍ²¿Êð»ìºÏÓ¦ÓóÌÐòBundle¡£¿´Ò»ÏÂËüµÄstart·½·¨£¬
public synchronized void start() { executorService = Executors.newSingleThreadExecutor(); c = new OSGiContainer(context); c.init(); reg = context.registerService(OSGiContainer.class.getName(), c, null); tracker = new BundleTracker(context, Bundle.ACTIVE | Bundle. STARTING, new HybridBundleTrackerCustomizer()); tracker.open(); } |
ÆäÖУ¬×îÖØÒªµÄÊdzõÆÚ»¯²¢×¢²áOSGiContainerÒÔ¼°´ò¿ªÒ»¸öBundleTrackerÀ´¸ú×Ù»ìºÏÓ¦ÓóÌÐòBundleÊÇ·ñ´¦ÓÚActive»òStarting״̬¡£¶ÔÓÚOSGiContainer£¬Ëü¾ßÌ帺ÔðÁ˲¿ÊðµÄ¹ý³Ì£¬´î½¨Á˲¿ÊðµÄ¹Ç¼Ü¡£¶ÔÓÚBundleTrackerÀ´Ëµ£¬Ëü»Ø´ðÁËÔçÆÚÌáµ½µÄ¡°ÈçºÎµÈ´ýWAB´¦ÓÚACTIVE״̬»òSTARTING״̬¡±µÄÎÊÌâ¡£¶ÔÓÚHybridBundleTrackerCustomizerÀ࣬ÆäÖеÄaddingBundle·½·¨ÖµµÃÎÒÃÇ¿´Ò»Ï£¬
public Object addingBundle(final Bundle bundle, BundleEvent event) { if (!isStarted()) return null; final int state = bundle.getState(); if (isReady(event, state)) { Future<OSGiApplicationInfo> future = executorService. submit(new Callable<OSGiApplicationInfo>() { @Override public OSGiApplicationInfo call()throws Exception{ return deploy(bundle); } }); deploymentTasks.put(bundle.getBundleId(), future); return bundle; } return null; } |
¿ÉÒÔÇåÎúµØ¿´µ½£¬Ò»µ©»ìºÏÓ¦ÓóÌÐòBundle´¦ÓÚActive»òStarting״̬£¬ÄÇô£¬Á¢¿ÌÆô¶¯Ò»¸öÏ߳̽øÐв¿Êð¡£
osgi-web-containerµÄActivator
osgi-web-containerµÄActivatorÊÇOSGiWebContainerActivator£¬Õâ¸öÀàµÄstart·½·¨ºÜ¼òµ¥£¬×¢²áWebExtender×÷ΪOSGi·þÎñ¡£¿ÉÒÔ¿´³ö£¬osgi-web-container×ñÑÁËExtenderģʽ£¬Ò»µ©×¢²á³É¹¦£¬osgi-javaee-baseÖеÄExtenderTracker½«¸ú×Ùµ½Ëü²¢µ÷ÓÃËüµÄstart·½·¨¡£ÏÂͼÊÇWebExtenderµÄÖ÷Òª´¦ÀíÂß¼£¬

½×¶Î2µÄǰ´«ÒѾ½²Í꣬½ÓÏÂÀ´£¬»Øµ½½×¶Î2µÄ²¿ÊðÉÏÀ´£¬ÒÔÏÂÊǽ׶Î2ÖÐÖ÷ÒªµÄ²¿ÊðʱÐòͼ£¬

ͼ9: ½×¶Î2ÖÐÖ÷ÒªµÄ²¿ÊðʱÐòͼ
ÏÂÃæ£¬ÏêϸµØËµÃ÷Ò»ÏÂͼ9Öеĸ÷¸öʱÐò¶¯×÷£¬
1.µ±JavaEEExtenderÖеÄHybridBundleTrackerCustomizer¸ú×Ùµ½WAB´¦ÓÚActive»òStarting״̬ʱ£¬¿ªÊ¼µ÷ÓÃOSGiContainerµÄdeploy·½·¨£¬ÕâÀïµÄOSGiContainerÀ´×Ôosgi-javaee-baseÄ£¿é²¢²»Êǽ׶Î1ÖÐÌáµ½µÄOSGiContainer£¬Çë×¢ÒâÇø·Ö¡£
2.OSGiContainerµÄdeploy·½·¨Ê×ÏÈÑ¡ÔñÕýÈ·µÄDeployer£¬·½·¨ÊÇͨ¹ý±éÀúËùÓÐÒѾע²áµÄOSGiDeployer·þÎñ£¬È»ºóÖð¸öµ÷ÓÃÕâЩOSGiDeployer·þÎñµÄhandles·½·¨À´Ñ¡ÔñÕýÈ·µÄDeployer¡£¶ÔÓÚWABÇéÐΣ¬ÕýÈ·µÄDeployerÊÇOSGiWebDeployer£¬ËüµÄhandles·½·¨ÈçÏÂ:
final Dictionary headers = b.getHeaders(); return headers.get(Constants.WEB_CONTEXT_PATH) != null && headers.get(org.osgi.framework.Constants.FRAGMENT_HOST) == null; |
ºÜÇåÎúµØ¿´µ½£¬Èç¹ûµ±Ç°BundleµÄÔªÊý¾ÝÖаüº¬ÁËWeb-ContextPathÇÒ²»°üº¬ Fragment-Host£¬ÄÇô¸ÃBundleÊÇÒ»¸öWAB£¬ÇÒOSGiWebDeployerÄܹ»´¦ÀíÕâÖÖÀàÐ͵ĻìºÏÓ¦ÓóÌÐòBundle¡£
3.Ñ¡ÔñÍêÕýÈ·µÄDeployerºó£¬OSGiContainerίÍÐOSGiWebDeployerÖ´ÐоßÌåµÄ²¿Êð¡£OSGiWebDeployerµÄdeploy·½·¨Ê×ÏÈ´´½¨OSGi²¿ÊðÇëÇó(OSGiWebDeploymentRequest)£¬È»ºóµ÷ÓÃOSGiWebDeploymentRequestµÄexecute·½·¨½øÐв¿Êð£¬ÔÚexecute·½·¨ÖУ¬Ö÷ÒªÖ´ÐÐÔ¤´¦Àí(preDeploy)£¬²¿ÊðµÄ×¼±¸¹¤×÷(prepare)£¬Êµ¼ÊµÄ²¿Êð(deploy)£¬ÒÔ¼°ºó´¦Àí(postDeploy)¡£
4.Ô¤´¦ÀíµÄºËÐÄÂß¼ÊÇʹÓÃContextPathCollisionDetector¼ì²âWebÉÏÏÂÎÄ·¾¶³åÍ»£¬ÕâÊÇOSGi
Web¹æ·¶±ØÐëµÄ¡£
5.²¿ÊðµÄ×¼±¸¹¤×÷ÖÐ×îÖØÒªµÄÊÇ´´½¨Ò»¸öOSGiWebDeploymentContext£¬OSGiWebDeploymentContextÊÇGlassFish
WABÖ§³ÖµÄÐÄÔ࣬Ëü¸ºÔðΪWAB´´½¨Ò»¸öÀà¼ÓÔØÆ÷(class loader)ÒԱ㵱ÓÐWebÇëÇóʱ£¬WebÈÝÆ÷Äܹ»ÕýÈ·µØ¼ÓÔØµ½WABÖÐÏà¹ØµÄ¾²Ì¬×ÊÔ´ºÍ¶¯Ì¬×ÊÔ´¡£Õâ¸öÀà¼ÓÔØÆ÷ΪWABClassLoader£¬Õâ¸öÀà¼ÓÔØÆ÷¼Ì³ÐÁËorg.glassfish.web.loader.WebappClassLoader£¬¶øºóÕßרÃÅÊÇGlassFish
WebÈÝÆ÷ÓÃÀ´ÊµÏÖ×ÊÔ´¼ÓÔØµÄ¡£ÎªÁË´´½¨Õâ¸öÀà¼ÓÔØÆ÷£¬ÐèÒªÖØÔØOSGiDeploymentContext.setupClassLoader·½·¨£¬ÈçÏÂËùʾ:
protected void setupClassLoader() throws Exception { finalClassLoader = new WABClassLoader(null); shareableTempClassLoader = finalClassLoader; WebappClassLoader.class.cast(finalClassLoader).start(); } |
6.×¼±¸¹¤×÷×öÍêºó£¬¿ªÊ¼Ö´ÐÐʵ¼ÊµÄ²¿Êð£¬Äã¿ÉÄÜÒѾ·¢ÏÖ£¬Êµ¼ÊµÄ²¿ÊðÔÙ´ÎίÍе½Á˽׶Î1ÖÐÌáµ½µÄApplicationLifecycle£¬Êǵģ¬ÎÒÃDz»ÐèÒªÔٴη¢Ã÷ÂÖ×Ó£¬ÒòΪApplicationLifecycleÔÚÄÇÀͨ¹ýËü£¬½«Õâ¸öWABÕ¹¿ªµ½glassfish4/glassfish/domains/domain1/applicationsÖУ¬ÔÚdomain.xmlÖÐдÈ벿ÊðµÄÐÅÏ¢µÈ£¬×ÜÖ®£¬Ïñ²¿Êð±ê×¼WARÒ»ÑùÈ¥²¿ÊðËü¡£
7.×îºó£¬»¹ÊÇÒªÖ´ÐÐһϺó´¦Àí¹¤×÷£¬ÒòΪ£¬Ò»µ©Ç°ÃæµÄ¶¯×÷²¿Êðʧ°ÜÁË£¬×ÜÊÇÐèÒª½øÐлعöʹϵͳµÄ״̬»Ö¸´µ½Ö®Ç°¡£
ÖÁ´Ë£¬WABµÄ²¿ÊðÒÔ¼°Ïà¹ØµÄʵÏÖÂß¼ÒѾдÍêÁË£¬ÏêϸµÄ´úÂë¿ÉÒÔʹÓÃSVNÏÂÔØGlassFish
FighterFish×Ó¹¤³Ì(https://svn.java.net/svn/glassfish~svn/trunk/fighterfish)À´Ñо¿Ò»Ï¡£
×îºó£¬Ïë¼òµ¥µØËµÒ»Ï¶ÔÓÚδÀ´µÄһЩ˼¿¼¡£
GlassFish OSGi-JavaEE
(Ò»): GlassFishÓëÆóÒµ¼¶OSGi¿ª·¢
|