ÂüÁ¶ ¹× ¹ø¿ª:
Understanding the OSGi "uses" Directive½ºÇÁ¸µ DM ¼¹ö ¶Ç´Â ´Ù¸¥ ¾î¶² OSGi Ç÷§Æû ±â¹ÝÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀ» ºôµå ÇÒ ¶§, ¿©·¯ºÐÀº ¾Æ¸¶µµ ¸ÓÁö¾Ê¾Æ "uses"¶ó´Â Áö½Ã¾î¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. ÀÌ Áö½Ã¾îÀÇ ¸ñÀûÀ» ºÐ¸íÇÏ°Ô ÀÌÇØÇÏÁö ¾Ê´Â´Ù¸é, ¿©·¯ºÐÀº ¾ðÁ¦ ±×°ÍÀ» »ç¿ëÇØ¾ß ÇÏ´ÂÁöµµ ¸ð¸¦ »Ó´õ·¯, "uses" Ãæµ¹("uses" conflict)·Î ÀÎÇØ ¹øµé resovle°¡ µÇÁö ¾ÊÀ» ¶§ Àǹ®¸¸ »ý±æ °ÍÀÌ´Ù. º» ±â»ç¿¡¼ "uses" Áö½Ã¾î¸¦ ÀÌÇØÇÏ°í, ¾ðÁ¦ »ç¿ëÇØ¾ß ÇÏ´ÂÁö, ±×¸®°í ¾î¶»°Ô "uses" Ãæµ¹À» µð¹ö±ëÇÏ´ÂÁö »ìÆ캸°Ú´Ù.
¹øµé ¸®Á¹·ç¼Ç(Resolution)
OSGi´Â ÀÏ´Ü ¹øµéÀÌ "¸®Á¹ºê"(resolve) »óÅ°¡ µÇµµ·Ï ¼³°èµÇ¾î ÀÖ´Ù. Ŭ·¡½º ij½ºÆ® ¿¹¿Ü³ª ŸÀÔÀÌ ¸ÂÁö ¾Ê¾Æ¼ ¹ß»ýÇÏ´Â ±×¿Í ºñ½ÁÇÑ ¹®Á¦µéÀÌ ¹ß»ýÇÏÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌ´Â OSGi°¡ °¢°¢ÀÇ ¹øµé¸¶´Ù ÇϳªÀÇ Å¬·¡½º ·Î´õ¸¦ »ç¿ëÇϱ⠶§¹®¿¡ »ç¿ëÀÚµéÀÌ Å¸ÀÔ ºÒÀÏÄ¡ ¹®Á¦¸¦ ¸¸³ª°Ô µÉ ¿©Áö°¡ ¸¹´Ù. ±×·¡¼ ¸Å¿ì Áß¿äÇÏ´Ù.
·±Å¸ÀÓ¿¡ »ç¿ëÇÏ·Á¸é ÀÏ´Ü Å¬·¡½º ·Î´õ¿¡ ÀÇÇØ Àڹ٠ŸÀÔÀÌ ·ÎµùÀÌ µÇ¾î¾ß ÇØ´ç ŸÀÔÀÇ Å¬·¡½º³ª °´Ã¼ °°Àº °ÍÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ·±Å¸ÀÓ Å¸ÀÔÀº ŸÀÔÀÇ Àüü Ŭ·¡½º À̸§°ú ÇØ´ç ŸÀÔÀ» Á¤ÀÇÇÑ Å¬·¡½º ·Î´õÀÇ Á¶ÇÕÀ¸·Î Á¤ÀÇÇÑ´Ù. ¸¸¾à µ¿ÀÏÇÑ Àüü Ŭ·¡½º À̸§ÀÌ µÎ °³ÀÇ ´Ù¸¥ Ŭ·¡½º ·Î´õ¸¦ »ç¿ëÇÏ¿© Á¤ÀǵǾî ÀÖ´Ù¸é, µÎ °³ÀÇ È£È¯ÇÏÁö ¾Ê´Â ·±Å¸ÀÓ Å¸ÀÔÀ» »ý¼ºÇÑ´Ù. ÀÌ·± ºñȣȯ¼ºÀ¸·Î ÀÎÇØ µÎ ŸÀÔÀÇ ¾î¶² "Á¢ÃË"(contact)À» ÇÏ°Ô µÉ °æ¿ì ·±Å¸ÀÓ ¿¡·¯¸¦ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î, ÀÌ µÎ ŸÀÔ Áß Çϳª¸¦ ´Ù¸¥ ŸÀÔÀ¸·Î ij½ºÆÃÀ» ½ÃµµÇÒ ¶§ Ŭ·¡½º ij½ºÆ® ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù.
OSGi´Â À¯ÀÏÇÑ Å¬·¡½º ·Î´õ ±â¹Ý ÀÚ¹Ù ¸ðµâ ½Ã½ºÅÛÀÌ ¾Æ´ÏÁö¸¸ Áö±Ý±îÁö °¡Àå ¼º¼÷ÇÑ ½Ã½ºÅÛÀÌ´Ù. Áï OSGi ¼³°èÀÚµéÀº ¿À·§µ¿¾È Èûµé°Ô ÀÌ·± Á¾·ùÀÇ ¹®Á¦µéÀ» ´Ù·Á¿Ô°í ±× ÇØ°áÃ¥À» OSGi ½ºÆå¿¡ Æ÷ÇÔ½ÃÄÑ¿Ô´Ù. OSGi ¼³°è´Â ÀÌ·± ¹®Á¦µéÀ» ¾ÖÇø®ÄÉÀÌ¼Ç Äڵ尡 µ¿ÀÛÇϱâ Àü¿¡ ¹ß°æÇÏ´Â °ÍÀÌ´Ù. Áï ¸®Á¹·ç¼Ç(resolusion)À̶ó´Â ´Ü°è¿¡¼ ¸»ÀÌ´Ù. ¸®Á¹·ç¼Ç(Resolution)Àº ÀÚ¹Ù¿Í °°Àº ¾ö°ÝÇÑ Å¸ÀÔ Á¦ÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ ¾ÖÇø®ÄÉÀÌ¼Ç Äڵ带 ½ÇÇàÇϱ⵵ Àü¿¡ ƯÁ¤ ¹®Á¦µéÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Â ÄÄÆÄÀÏ°ú À¯»çÇÏ´Ù. ¿©·¯ºÐÀÇ ¹øµéÀ» resovle ÇÏ·Á¸é °¡²û ¸Ó¸®°¡ ¾ÆÇà ¼öµµ ÀÖ´Ù ÇÏÁö¸¸ À̴ Ŭ·¡½º ij½ºÆ® ¿¹¿Ü¿Í °°Àº ·±Å¸ÀÓ ¿¡·¯ Áø´ÜÀ» ÇØÁØ´Ù.
±×·¡¼ ¹øµé ¸®Á¹ºê(resolve)´Â ¹«¾ùÀ» ÀǹÌÇϴ°¡? ÀÌ°ÍÀº ¹øµéÀÇ ÀÇÁ¸¼ºÀ» È®ÀÎÇß´Ù´Â ¶æÀÌ´Ù. ÀϹÝÀûÀ¸·Î ÇØ´ç ¹øµéÀÌ »ç¿ëÇÏ´Â(import) ÆÐÅ°Áö¸¦ °ø°³ÇÑ(export) ¹øµéµéÀ» ã¾Ò°í ±× ¹öÀü Á¦¾àÀ» ¸¸Á·½ÃŲ´Ù´Â ¶æÀÌ´Ù. °¡Àå ¸íÈ®ÇÑ Á¦¾à »çÇ×Àº ¸ðµç °ø°³µÈ(export) ÆÐÅ°Áö ¹öÀüÀÌ »ç¿ëÇÏ·Á´Â(import) ÆÐÅ°Áö ¹öÀü ¹üÀ§ ³»¿¡ Æ÷ÇԵǾî¾ß ÇÑ´Ù. ¶Ç ´Ù¸¥ Á¦¾à »çÇ×À¸·Î´Â ÆÐÅ°Áö ÀÓÆ÷Æ®(import)¿¡ ±â¼ú ÇÒ ¼ö ÀÖ´Â ÀÓÀÇ ¼Ó¼ºÀÌ ±×¿¡ ´ëÀÀÇÏ´Â ÆÐÅ°Áö ÀͽºÆ÷Æ®(export) ¼Ó¼º°ú ÀÏÄ¡ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.
¿©·¯ ¹øµé¿¡ ÀÇÇØ °ø°³µÈ ÆÐÅ°Áö
¿ì¸®°¡ °ð »ìÆ캼 uses Áö½Ã¾î´Â Çϳª ÀÌ»óÀÇ ¹øµé¿¡ ÀÇÇØ °ø°³µÇ´Â ÆÐÅ°Áö¿¡¼ ¹ß»ýÇϴ ŸÀÔ ºÒÀÏÄ¡¸¦ ÇØ°áÇÒ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù. ¾î¶² ÇÑ ¹øµéÀÇ Å¸ÀÔÀ» ´Ù¸¥ ¹øµéÀÇ Å¸ÀÔÀ¸·Î »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§, ·±Å¸ÀÓ Å¸ÀÔÀÌ È£È¯µÇÁö ¾Ê±â ¶§¹®¿¡, ŸÀÔ ºÒÀÏÄ¡ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î, ¾î¶² ¹øµé¿¡¼ ´Ù¸¥ ¹øµéÀÇ Å¬·¡½º À̸§ÀÌ °°Áö¸¸ ´Ù¸¥ ŸÀÔÀ¸·Î ŸÀÔ Ä³½ºÆÃÀ» ½ÃµµÇÒ ¶§ Ŭ·¡½º ij½ºÆà ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. ¾î¶»°Ô ÀÌ·± ÀÏÀÌ ¹ß»ýÇÒ±î? ¹øµéÀº µ¿ÀÏÇÑ ÆÐÅ°Áö¸¦ Çϳª ÀÌ»óÀÇ ¹øµé¿¡¼ °¡Á®¿Ã(import) ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. »óÃæÇϴ ŸÀÔÀ» Á¢ÃË(contact) ½Ãų ¾î¶² ¹æ¹ýÀÌ ÀÖ¾î¾ß ÇÑ´Ù. It happens by a type being passed "through" a type in another package..
¾î¶² ŸÀÔÀ» ´Ù¸¥ ŸÀÔÀ¸·Î Àü´Þ(pasess through)ÇÏ´Â ¹æ¹ýÀº µÎ °¡Áö°¡ ÀÖ´Ù. ù ¹ø° ¹æ¹ýÀº ¾î¶² ŸÀÔÀÌ ´Ù¸¥ ŸÀÔÀ» ¸í½ÃÀûÀ¸·Î ÂüÁ¶ÇÏ´Â °ÍÀÌ´Ù,. ¿¹¸¦ µé¾î, ´ÙÀ½Àº org.bar ÆÐÅ°Áö¿¡ ÀÖ´Â Bar ŸÀÔÀÇ ¾î¶² ¸Þ¼Òµå´Â org.foo ÆÐÅ°ÁöÀÇ Foo ŸÀÔÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.
public Foo getFoo();
¾î¶² ŸÀÔÀ» ´Ù¸¥ ŸÀÔÀ¸·Î ¾Ï¹¬ÀûÀ¸·Î Àü´ÞÇÏ´Â µÎ ¹ø° ¹æ¹ýÀº ¼ºêŸÀÔÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù, ¿¹¸¦ µé¾î, ´ÙÀ½Àº ¼ºêŸÀÔÀ» ÂüÁ¶ÇÏ´Â ¸Þ¼Òµå ½Ã±×³ÊÃÄ´Ù.
public Object getFoo();
¾Ï¹¬ÀûÀÎ °æ¿ì, ¼ºêŸÀÔÀÇ °´Ã¼´Â ¾î´À ¼ø°£¿¡´Â »óÃæÇϴ ŸÀÔÀ¸·Î ij½ºÆÃµÉ °ÍÀÌ´Ù.
ÀÚ¹Ù ÄÚµå ¼öÁØ¿¡¼ ±×·± ŸÀÔ ºÒÀÏÄ¡°¡ ¾î?F°Ô ¹ß»ýÇϴ°¡. ¹øµé manifest°¡ ¾î¶»°Ô »ý°å´ÂÁö »ìÆ캸ÀÚ.
ÇÊ¿äÇÑ Å¸ÀÔ Foo´Â org.bar ÆÐÅ°Áö¸¦ °ø°³ÇÏ´Â(export) ¹øµé°ú µ¿ÀÏÇÑ ¹øµéÀÌ °ø°³Çϰųª
bundle-symbolicname: B
bundle-manifestversion: 2
export-package: org.foo,org.bar
¶Ç´Â ´Ù¸¥ ¹øµé(F)ÀÌ °ø°³ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.
bundle-symbolicname: B
bundle-manifestversion: 2
export-package: org.bar
import-package: org.foo
bundle-symbolicname: F
bundle-manifestversion: 2
export-package: org.foo
"uses" Áö½Ã¾î´Â OSGi°¡ À§¿Í °°Àº ŸÀÔ ºÒÀÏÄ¡¸¦ ¹øµé ¸®Á¹·ç¼Ç °úÁ¤¿¡¼ Áø´ÜÇÒ ¼ö ÀÖµµ·Ï µµÀԵǾú´Ù.
"uses" Áö½Ã¾î
À§¿Í °°Àº ÀáÀçÀûÀΠŸÀÔ ºÒÀÏÄ¡¸¦ ¸®Á¹·ç¼Ç °úÁ¤¿¡¼ ã¾Æ³»±â À§ÇØ, ÀÚ¹Ù ÄÚ½º ¼öÁØ¿¡¼ÀÇ ¸í½ÃÀûÀÎ ¶Ç´Â ¾Ï¹¬ÀûÀΠŸÀÔÀ» ±×¿¡ »óÀÀÇÏ´Â ¹øµé manifest¿¡ ¼±¾ðÇØ¾ß ÇÑ´Ù. °ø°³ÇÏ´Â ÆÐÅ°Áö´Â "uses" Áö½Ã¾î¸¦ ºÙ¿©¼ ÇØ´ç ÆÐÅ°Áö°¡ ÂüÁ¶ÇÒ ÆÐÅ°Áö¸¦ ¼±¾ðÇØÁØ´Ù.
À§ ¿¹Á¦¿¡¼, °ø°³ÇÏ´Â ÆÐÅ°Áö org.bar´Â org.foo ÆÐÅ°Áö¸¦ "»ç¿ë"(use) ÇÑ´Ù°í ¼±¾ðÇÑ´Ù.
¡¦
export-package: org.bar;uses:="org.foo"
¡¦
"uses" Áö½Ã¾î¿¡¼ »ç¿ëÇÏ´Â ÆÐÅ°Áö³ª ÆÐÅ°ÁöµéÀº "uses" Áö½Ã¾î¸¦ »ç¿ëÇÏ°í ÀÖ´Â ¹øµé manifest¿¡¼ °ø°³(export) ¶Ç´Â °¡Á®¿Ã(import) ÆÐÅ°Áö¿¡ ¸í½ÃµÇ¾î ÀÖ´Â °ÍµéÀ̾î¾ß ÇÑ´Ù. µû¶ó¼ ´ÙÀ½Àº À¯È¿ÇÑ manifestÁö¸¸
¡¦
export-package: p;uses:="q,r", q
import-package: r
¡¦
´ÙÀ½Àº À¯È¿ÇÏÁö ¾ÊÀº manifest´Ù.(q ÆÐÅ°Áö¸¦ export ¶Ç´Â import ÇÏ°í ÀÖÁö ¾Ê±â ¶§¹®¿¡)
¡¦
export-package: p;uses:="q,r"
import-package: r
¡¦
ÃßÀÌÀûÀÎ "ueses"
ŸÀÔ ÂüÁ¶´Â ÃßÀÌÀûÀÌ´Ù. ¿¹¸¦ µé¾î, ŸÀÔ C¸¦ ÂüÁ¶Çϴ ŸÀÔ B¸¦ ŸÀÔ A°¡ ÂüÁ¶ÇÒ °æ¿ì¿¡, AÀÇ »ç¿ëÀÚ´Â B¸¦ ÅëÇؼ C¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.
ŸÀÔ ÂüÁ¶°¡ ÀÌ·¸°Ô ÃßÀÌÀûÀ̱⠶§¹®¿¡, OSGi´Â ÀÚµ¿ÀûÀ¸·Î À̸¦ °í·ÁÇß´Ù. "uses" Áö½Ã¾îÀÇ "ÃßÀÌÀûÀΠŬ·ÎÁ®"(transitive closure)¶ó°í ¾Ë·ÁÁ® ÀÖ´Â °ÍÀÌ ¹Ù·Î ±×°ÍÀÌ´Ù. ÀÌ°ÍÀº "uses" Áö½Ã¾î¸¦ »ç¿ëÇϱ⸸ Çϸé OSGi°¡ ¾Ë¾Æ¼ ÃßÀÌÀûÀΠŸÀÔ ÂüÁ¶¸¦ ´Ù·ïÁشٴ °ÍÀÌ´Ù.
¿¹¸¦ µé¾î, ´ÙÀ½ ¹øµé manifest¸¦ º¸ÀÚ
¡¦
export-package: p;uses:="q,r", q;uses:="r"
import-package: r
¡¦
¹®¹ý¿¡ ¸Â´Ù. ´ÙÀ½ ¹øµé manifest´Â "p¿¡¼ q", "q¿¡¼ r" ±×¸®°í "(ÃßÀÌÀûÀ¸·Î) p¿¡¼ r" ŸÀÔ ÂüÁ¶¸¦ ÃæºÐÈ÷ Àß Ç¥ÇöÇÑ °ÍÀÌ´Ù.
¡¦
export-package: p;uses:="q",q;uses:="r"
import-package: r
¡¦
(¿ªÀÚ ÁÖ, À§¶û ¾Æ·¡¶û °°À¸´Ï±î ¾Æ·¡Ã³·³ »ç¿ëÇصµ µÈ´Ù´Â ¶æÀÔ´Ï´Ù.)
"uses" Ãæµ¹ °¨ÁöÇϱâ(Diagnosing)
¹øµé ·¹Á¹·ç¼Ç °úÁ¤Àº ¸ðµç Á¦¾à »çÇ×À» È®ÀÎÇÏ´Â °ÍÀÌ ÁÖ¸ñÀûÀÌ´Ù. µû¶ó¼ ¸ðµç "uses" Á¦¾à »çÇ×ÀÌ ¸¸Á·ÇÏÁö ¾ÊÀ» °æ¿ì "uses" Ãæµ¹À» º¸°íÇÒ °ÍÀÌ´Ù. ½ºÇÁ¸µ dm ¼¹ö°¡ ÁÖ´Â Áø´Ü À̽´´Â ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϴµ¥ µµ¿òÀ» ÁØ´Ù.
¿ø¸®¸¦ ÀÌÇØÇϱâ À§ÇØ ¸¸µç ¿¹Á¦¸¦ »ìÆ캸ÀÚ. Ŭ¶óÀ̾ðÆ® ¹øµé C°¡ »ç¿ëÇÒ ¸î¸î À¯Æ¿¸®Æ¼ ¹øµé F¿Í BÀ» ¸¸µé°í ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ. »õ·Î¿î ¹öÀüÀÇ F¸¦ Ãß°¡ÇÏ°í´ÙÀ½ mainfestµéÀ» °¡Áö°í ¼¹ö¿¡ ¹èÆ÷ÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: F
Bundle-Version: 1
Bundle-Name: F Bundle
Export-Package: org.foo;version=1
(¿ªÀÚ ÁÖ, ¹öÀüÀÌ 1À̴ϱî ÀÌÀü¿¡ »ç¿ëÇÏ´ø F À¯Æ¿ ¹øµé À̰ڳ׿ä.)
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: F
Bundle-Version: 2
Bundle-Name: F Bundle
Export-Package: org.foo;version=2
(¿ªÀÚ ÁÖ, ¹öÀüÀÌ 2´Ï±î À̹ø¿¡ »õ·Î Ãß°¡ÇÑ F À¯Æ¿ ¹øµéÀΰ¡ º¾´Ï´Ù.)
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: B
Bundle-Version: 1
Bundle-Name: B Bundle
Export-Package: org.bar;uses:="org.foo"
Import-Package: org.foo;version="[1,2)"
(¿ªÀÚ ÁÖ, À̰͵µ À¯Æ¿ ¹øµéÀε¥, F À¯Æ¿ ¹øµé 1¿Í 2°¡ °ø°³ÇÏ´Â(export) org.foo ÆÐÅ°Áö ¹öÀü 1 ÀÌ»ó 2 ¹Ì¸¸À» »ç¿ëÇÏ°í ÀÖ±º¿ä. °á±¹ F À¯Æ¿ ¹øµé ¹öÀü 1À» »ç¿ëÇϰڳ׿ä.)
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: C
Bundle-Version: 1.0.0
Bundle-Name: C Bundle
Import-Package: org.bar,org.foo;version="[2,3)"
(¿ªÀÚ ÁÖ, ÀÌ°Ç Å¬¶óÀ̾ðÆ® ¹øµéÀÎ C Àε¥ org.foo ÆÐÅ°Áö¸¦ »ç¿ëÇÏ´Â µ¥ ±× ¹öÀüÀÌ... ÀÌ·±.. 2 ÀÌ»ó 3 ¹Ì¸¸À» »ç¿ëÇÕ´Ï´Ù. ±×·¯¸é ÀÌ ¹øµéÀº Áö±Ý »õ·Î ¼³Ä¡ÇÑ F À¯Æ¿ ¹øµé ¹öÀü 2¸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù. ¹º°¡ ²¿¿´±º¿ä. ¿Ö³Ä¸é ¿©±â¼ ¶Ç »ç¿ëÇϱâ·Î(import)µÇ¾î ÀÖ´Â org.bar ÆÐÅ°Áö¿¡¼´Â F À¯Æ¿ ¹øµé ¹öÀü 1ÀÇ org.foo ÆÐÅ°Áö¸¦ »ç¿ëÇϴϱî¿ä. µÎ ÆÐÅ°Áö°¡ ȣȯµÇÁö ¾ÊÀÚ³ª¿ä. °°Àº ÆÐÅ°ÁöÁö¸¸ ´Ù¸¥ ¹øµéÀÌ °ø°³ÇÑ °Å´Ï±î ·±Å¸ÀÓ Å¸ÀÔÀÌ ´Ù¸£ÁÒ. ¿Ö³Ä¸é Ŭ·¡½º·Î´õ°¡ ´Ù¸£´Ï±î.)
C ¹øµéÀ» ¼³Ä¡ÇÏ·Á°í Çϸé, dm ¼¹ö´Â ´ÙÀ½°ú °°Àº ·Î±× ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù,
<SPDE0018E> Unable to install application from location 'file:/xxx/C.jar/'. Could not satisfy constraints for bundle 'C' at version '1.0.0'.
Cannot resolve: C
Resolver report:
Bundle: C_1.0.0 - Uses Conflict: Import-Package: org.bar; version="0.0.0"
Possible Supplier: B_1.0.0 - Export-Package: org.bar; version="0.0.0"
Possible Conflicts: org.foo
ÀÌ Áß¿¡¼
Bundle: C_1.0.0 - Uses Conflict: Import-Package: org.bar; version="0.0.0"
ÀÌ ÁÙÀº org.bar ÆÐÅ°Áö ÀÓÆ÷Æ®¿Í °ü·ÃÇÏ¿© "uses" Á¦¾à À§¹ÝÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë·ÁÁØ´Ù. Áï, C°¡ »ç¿ëÇÏ·Á°í ÇÏ´Â °ø°³µÈ(export) org.barÀÇ "uses"°¡ ¸¸Á·½º·¯¿î »óȲÀÌ ¾Æ´Ï¶ó´Â °ÍÀÌ´Ù.
Possible Supplier: B_1.0.0 - Export-Package: org.bar; version="0.0.0"
ÀÌ ÁÙÀº org.bar °ø±ÞÀÚ°¡ Àǽɽº·´´Ù´Â °ÍÀÌ°í
Possible Conflicts: org.foo
ÀÌ ÁÙÀº ¾î¶² ÆÐÅ°Áö¿¡¼ "uses" Á¦¾à »çÇ×ÀÌ À§¹ÝµÇ´ÂÁö ¾Ë·ÁÁØ´Ù.
±¸Ã¼ÀûÀÎ °Í¿¡¼ ´Ù½Ã µ¹¾Æ¿Í¼, ¿ì¸®´Â "uses" Ãæµ¹ÀÌ ¹ß»ýÇÑ ÀÌÀ¯¸¦ ¾Ë°í ÀÖ´Ù. ¹øµé C°¡ °¡Á®¿À´Â org.foo ÆÐÅ°Áö°¡ ¹øµé B°¡ °¡Á®¿À´Â °Í°ú ¹öÀüÀÌ ´Ù¸£±â ¶§¹®ÀÌ´Ù. B°¡ ÃֽŠ¹öÀüÀÇ F¸¦ »ç¿ëÇϵµ·Ï ¼³Á¤ÇÏ´Â °ÍÀ» ±ôºýÇß´Ù.
BÀÇ manifest¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: B
Bundle-Version: 1
Bundle-Name: B Bundle
Export-Package: org.bar;uses:="org.foo"
Import-Package: org.foo;version="[2,3)"
ÀÌÁ¦ ¹øµé C¸¦ ¼º°øÀûÀ¸·Î ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù.
º¹ÀâÇÑ "uses" Ãæµ¹ Áø´ÜÇϱâ
ÀǵµÀûÀ¸·Î ¸¸µç "uses" Ã溼Àº ¹øµé manifest¸¦ º¸°í¼·Î ¾Ë ¼ö ÀÖÀ» ¸¸Å °£´ÜÇÑ ¹®Á¦¿´´Ù. ÇÏÁö¸¸ ¸Å¿ì ¸¹Àº Ãæµ¹ °¡´É¼ºÀÌ ÀÖ´Â "uses" Áö½Ã¾î ¸ñ·Ï°ú °°Àº Á» ´õ º¹ÀâÇÑ "uses" Ãæµ¹ÀÇ °æ¿ì, Equinox ÄܼÖ(2401Æ÷Æ®·Î telnet)À» »ç¿ëÇÏ¿© ¼º°øÀûÀ¸·Î ¼³Ä¡µÈ ¹øµéÀ» È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù.(dm ¼¹ö´Â ¼º°øÀûÀ¸·Î ¹èÆ÷ÇÏÁö ¸øÇÑ ¹øµéÀº uninsatll ½ÃŲ´Ù.)
ÀÌÄû³ì½º ÄÜ¼Ö ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ¼³Ä¡µÈ ¹øµé ¸ñ·ÏÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.,
osgi> ss
À§¿¡¼ ¸¸µé¾îº» ¹®Á¦ »óȲ¿¡¼ ´ÙÀ½°ú °°Àº ¸ñ·ÏÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
¡¦
82 ACTIVE F_1.0.0
84 ACTIVE F_2.0.0
85 ACTIVE B_1.0.0
B ¹øµé manifest¸¦ º¸·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
osgi> headers 85
±×¸®°í ÆÐÅ°Áö org.foo ÆÐÅ°Áö¸¦ °ø°³ÇÑ ¹øµé°ú »ç¿ëÇÏ´Â ¹øµéÀ» º¸·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
osgi> packages org.foo
¿ä¾à
º» ±â»ç´Â "uses" Áö½Ã¾î Çʿ伺À» »ìÆìºÃ°í, À̸¦ »ç¿ëÇÏ¿© ŸÀÔ ºÒÀÏÄ¡ ¿¡·¯ ¹®Á¦¸¦ Á¶±â¿¡ Áø´ÜÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» º¸¾Ò´Ù. ±×¸®°í dm ¼¹ö Áø´Ü°ú ÀÌÄû³ì½º ÄܼÖÀ» »ç¿ëÇÏ¿© "uses" Á¦¾à À§¹ÝÀ» È®ÀÎÇÏ´Â ¹æ¹ýµµ »ìÆ캸¾Ò´Ù.
(¸¶Áö¸· ´Ü¶ôÀº ¹ø¿ª ½ºÅµ)
You may think the "uses" directive is more trouble than it is worth, but when you consider the alternative of tracking down the reason for a possibly obscure class cast exception while your application is running, you should start to see the rationale for "uses". Indeed any Java module system which doesn't provide the equivalent of "uses" constraints is likely to give you class cast exceptions at runtime once you have gotten to the point of having multiple versions of your application modules. The OSGi "uses" directive solves a general problem of Java modularity.