Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
GlassFish OSGi-JavaEE£¨¶þ£©£ºÀí½âOSGi WEBÓ¦ÓóÌÐò¹æ·¶
 
×÷Õß ÌÀÓ¾£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-10-17
  6041  次浏览      27
 

ÔÚ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¿ª·¢

   
6041 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö


Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ


Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ