ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ´Â ƯÁ¤ ¹æ½ÄÀ¸·Î ÇÁ·ÎÁ§Æ®ÀÇ ÀÚ¿øÀ» Á¶ÀÛÇÏ´Â ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù. ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ´Â ¶Ç´Ù¸¥ À¯ÇüÀÇ Ç׸ñ ¶Ç´Â ÀÚ¿øÀ» ÀÛ¼ºÇϱâ À§ÇØ ÀÚ¿ø¿¡ º¯È¯À» Àû¿ëÇÏ´Â µ¥ ÀÚÁÖ »ç¿ëµË´Ï´Ù. ºô´õ·Î ÀÛ¼ºÇÑ ÀÚ¿øÀº ÀϹÝÀûÀ¸·Î ÆÄ»ý ÀÚ¿øÀ¸·Î Ç¥½ÃµË´Ï´Ù.
Ç÷¯±×ÀÎÀº Ư¼ö ÀÚ¿ø º¯È¯À» ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï Ç÷§Æû¿¡ ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ Á¦°øÇÕ´Ï´Ù. ¿¹¸¦ µé¾î JDT(Java Development Tools)´Â Java ÇÁ·ÎÁ§Æ®¿¡¼ ÆÄÀÏÀÌ Ãß°¡µÇ°Å³ª ¼öÁ¤µÉ ¶§¸¶´Ù Java ¼Ò½º ÆÄÀÏÀ» Ŭ·¡½º ÆÄÀÏ·Î ÄÄÆÄÀÏÇÏ´Â ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¶ÇÇÑ Á¾¼Ó ÆÄÀÏÀ» Áö¼ÓÀûÀ¸·Î ÃßÀûÇϰí ÇÊ¿äÇÒ ¶§ ÀÌ ÆÄÀÏÀ» ´Ù½Ã ÄÄÆÄÀÏÇÕ´Ï´Ù.
APIÀÇ °üÁ¡¿¡¼ Ç÷§ÆûÀº ´ÙÀ½°ú °°ÀÌ µÎ °³ÀÇ ±âº» ºôµå À¯ÇüÀ» Á¤ÀÇÇÕ´Ï´Ù.
ÁõºÐ ºôµå´Â ÀÚ¿ø º¯°æ µ¨Å¸·Î ¼öÇàµË´Ï´Ù. µ¨Å¸´Â ºô´õ°¡ ÇÁ·ÎÁ§Æ®¸¦ ¸¶Áö¸·À¸·Î ºôµåÇÑ ÀÌÈÄ·Î ¸ðµç ÀÚ¿ø¿¡¼ º¯°æ»çÇ׿¡ ´ëÇÑ ÃÖÁ¾ °á°ú¸¦ ¹Ý¿µÇÕ´Ï´Ù. ÀÌ µ¨Å¸´Â ÀÚ¿ø º¯°æ À̺¥Æ® ³»¿¡¼ »ç¿ëµÇ´Â µ¨Å¸¿Í À¯»çÇÕ´Ï´Ù.
ÇÁ·ÎÁ§Æ®´Â ´ÙÀ½¿¡ ÁõºÐ ºôµå°¡ ÇØ´ç ÇÁ·ÎÁ§Æ®¿¡¼ ¼öÇàµÉ ¶§ ¿ÏÀüÇÑ ÇÁ·ÎÁ§Æ®¸¦ ´Ù½Ã ºôµåÇϵµ·Ï °Á¦ ½ÇÇàÇϱâ À§ÇØ »ç¿ëÀÚ°¡ ÁÖ±âÀûÀ¸·Î Á¤¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÁ·ÎÁ§Æ®¸¦ Á¤¸®ÇÏ¸é ¹®Á¦Á¡ ¸¶Ä¿ ¹× Ŭ·¡½º ÆÄÀϰú °°Àº ºôµå Á¤º¸°¡ Á¦°ÅµË´Ï´Ù.
¿¹¸¦ µé¾î ºô´õ¸¦ ¼³¸íÇϸé ÀÌÇØÇϱ⠽±½À´Ï´Ù. JDT Java ÄÄÆÄÀÏ·¯´Â º¯°æ»çÇ×À¸·Î ¿µÇâÀ» ¹Þ´Â ÇÁ·ÎÁ§Æ®ÀÇ ÆÄÀÏÀ» ´Ù½Ã ÄÄÆÄÀÏÇÏ´Â Java ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ ÅëÇØ ±¸µ¿µË´Ï´Ù. Àüü ºôµå(¶Ç´Â Á¤¸® ÈÄ ÁõºÐ ºôµå)°¡ Æ®¸®°ÅµÇ¸é ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç .java ÆÄÀÏÀÌ ÄÄÆÄÀϵ˴ϴÙ. ¹ß»ýÇÑ ÄÄÆÄÀÏ ¹®Á¦Á¡Àº ¿µÇâÀ» ¹ÞÀº .java ÆÄÀÏ¿¡ ¹®Á¦Á¡ ¸¶Ä¿·Î Ãß°¡µË´Ï´Ù. ÁõºÐ ºôµå°¡ Æ®¸®°ÅµÇ¸é, Ãß°¡, º¯°æ ¶Ç´Â ¿µÇâÀ» ¹ÞÀº .java ÆÄÀÏÀ» ¼±ÅÃÀûÀ¸·Î ´Ù½Ã ÄÄÆÄÀÏÇÕ´Ï´Ù. ÀÌ .java ÆÄÀÏÀº ÀÚ¿ø µ¨Å¸¿¡ ¼³¸íµÇ¸ç ÇÊ¿äÇÒ °æ¿ì ¹®Á¦Á¡ ¸¶Ä¿¸¦ °»½ÅÇÕ´Ï´Ù. ´õ ÀÌ»ó ÀûÇÕÇÏÁö ¾ÊÀº .class ÆÄÀÏ ¶Ç´Â ¸¶Ä¿´Â Á¦°ÅµË´Ï´Ù.
ÁõºÐ ºôµå´Â ¼ö¹é ¶Ç´Â ¼öõ°³ÀÇ ÀÚ¿øÀ» °¡Áö°í ÀÖ´Â ÇÁ·ÎÁ§Æ®¿¡ ´ëÇØ ³ôÀº ¼º´É»óÀÇ ÀÌÁ¡À» Á¦°øÇÏ´Â µ¥ ´ëºÎºÐÀÇ ÀÚ¿øÀº ÁÖ¾îÁø ƯÁ¤ ½Ã°£¿¡ º¯°æµÇÁö ¾Ê½À´Ï´Ù.
ÁõºÐ ºôµåÀÇ ±â¼úÀû ¾î·Á¿òÀº ¾î¶² Ç׸ñÀ» ´Ù½Ã ºôµåÇØ¾ß ÇÏ´ÂÁö Á¤È®È÷ ÆÇº°ÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î Java ºô´õ·Î À¯Áöº¸¼öµÇ´Â ³»ºÎ »óÅ¿¡´Â Á¾¼Ó¼º ±×·¡ÇÁ ¹× º¸°íµÈ ÄÄÆÄÀÏ ¹®Á¦Á¡ ¸ñ·Ï°ú °°Àº »çÇ×ÀÌ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀÌ Á¤º¸´Â ÁõºÐ ºôµå ½Ã Java ÀÚ¿øÀÇ º¯°æ¿¡ ÀÀ´äÇÏ¿© ´Ù½Ã ÄÄÆÄÀÏÇØ¾ß Çϴ Ŭ·¡½º¸¦ ½Äº°ÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù.
ºôµåÀÇ ±âº» ±¸Á¶°¡ Ç÷§Æû¿¡ Á¤ÀǵǾî ÀÖ´õ¶óµµ ½ÇÁ¦ ÀÛ¾÷Àº ºô´õ Äڵ忡¼ ¼öÇàµË´Ï´Ù. º¹ÀâÇÑ ÁõºÐ ºô´õ¸¦ ±¸ÇöÇϱâ À§ÇÑ ÆÐÅÏ¿¡ ´ëÇØ¼´Â ¿©±â¿¡¼ ¼³¸íÇÏÁö ¾Ê½À´Ï´Ù. °¢ ±¸ÇöÀº ƯÁ¤ ºô´õ ¼³°è¿¡ µû¶ó ´Ù¸£±â ¶§¹®ÀÔ´Ï´Ù.
´ÙÀ½ ¹æ¹ý Áß Çϳª¸¦ »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î ºô´õ¸¦ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
½ÇÁ¦·Î Workbench »ç¿ëÀÚ´Â ÀÚ¿ø ³×ºñ°ÔÀÌÅÍ ¸Þ´º¿¡¼ ÇØ´ç ¸í·ÉÀ» ¼±ÅÃÇÏ¿© ºôµå¸¦ Æ®¸®°ÅÇÕ´Ï´Ù.
ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ´Â ÀÚµ¿ ºôµå µ¿¾È Ç÷§Æû¿¡ ÀÇÇØ ¾Ï½ÃÀûÀ¸·Î È£ÃâµÇ±âµµ ÇÕ´Ï´Ù. ÀÚµ¿ ºôµå¸¦ »ç¿ëÇÒ °æ¿ì, ÀÛ¾÷°ø°£ÀÌ º¯°æµÉ ¶§¸¶´Ù ½ÇÇàµË´Ï´Ù.
org.eclipse.core.resources.builders È®ÀåÁ¡Àº Ç÷§Æû¿¡ ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ Á¦°øÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ´ÙÀ½ ¸¶Å©¾÷Àº °¡»óÀÇ Ç÷¯±×ÀÎ com.example.builders°¡ ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ Á¦°øÇÏ´Â ¹æ¹ýÀ» Ç¥½ÃÇÑ °ÍÀÔ´Ï´Ù.
<extension id="mybuilder" name="My Sample Builder" point="org.eclipse.core.resources.builders"> <builder <run class="com.example.builders.BuilderExample"> <parameter name="optimize" value="true" /> <parameter name="comment" value="Builder comment" /> </run> </builder> </extension>
È®ÀåÁ¡¿¡¼ ½Äº°µÈ Ŭ·¡½º´Â IncrementalProjectBuilder Ç÷§Æû Ŭ·¡½º¸¦ È®ÀåÇØ¾ß ÇÕ´Ï´Ù.
public class BuilderExample extends IncrementalProjectBuilder { IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { // add your build logic here return null; } protected void startupOnInitialize() { // add builder init logic here } protected void clean(IProgressMonitor monitor) { // add builder clean logic here } }
ºôµå 󸮴 build() ¸Þ¼Òµå·Î ½ÃÀ۵Ǵµ¥, ÀÌ ¸Þ¼Òµå¿¡´Â ¿äûµÈ ºôµå À¯Çü¿¡ ´ëÇÑ Á¤º¸°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ºôµå´Â ´ÙÀ½ °ª Áß ÇϳªÀÔ´Ï´Ù.
ÁõºÐ ºôµå°¡ ¿äûµÈ °æ¿ì ¸¶Áö¸· ºôµå ÀÌÈÄÀÇ ÀÚ¿ø º¯°æ»çÇ×À» ¼³¸íÇϱâ À§ÇØ ÀÚ¿ø µ¨Å¸°¡ Á¦°øµË´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº build() ¸Þ¼Òµå¸¦ »ó¼¼È÷ ¼³¸íÇÕ´Ï´Ù.
protected IProject[] build(int kind, Map args, IProgressMonitor monitor throws CoreException { if (kind == IncrementalProjectBuilder.FULL_BUILD) { fullBuild(monitor); } else { IResourceDelta delta = getDelta(getProject()); if (delta == null) { fullBuild(monitor); } else { incrementalBuild(delta, monitor); } } return null; }
ÇÁ·ÎÁ§Æ® "X"¸¦ ºôµåÇÒ ¶§, ºô´õ°¡ ÀϺΠ´Ù¸¥ ÇÁ·ÎÁ§Æ® "Y"ÀÇ º¯°æ»çÇ׿¡ ´ëÇÑ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏ´Â °æ¿ì(¿¹: XÀÇ Java Ŭ·¡½º°¡ Y¿¡ Á¦°øµÈ ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö)°¡ ÀÖ½À´Ï´Ù. X¸¦ ºôµåÇÏ´Â µ¿¾È getDelta(Y)¸¦ È£ÃâÇϸé YÀÇ µ¨Å¸¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Ç÷§ÆûÀÌ ÇØ´ç µ¨Å¸¸¦ Á¦°øÇϵµ·Ï ÇÏ·Á¸é XÀÇ ºô´õ°¡ ÀÌÀü build() È£Ãâ¿¡¼ Y°¡ µé¾î ÀÖ´Â ¹è¿À» ¸®ÅÏÇÏ¿© X¿Í Y °£¿¡ Á¾¼Ó¼ºÀ» ¼±¾ðÇØ¾ß ÇÕ´Ï´Ù. ºô´õ¿¡ Á¾¼Ó¼ºÀÌ ¾øÀ¸¸é ´Ü¼øÈ÷ ³Î(null)À» ¸®ÅÏÇÒ ¼ö ÀÖ½À´Ï´Ù. Ãß°¡ Á¤º¸´Â IncrementalProjectBuilder¸¦ ÂüÁ¶ÇϽʽÿÀ.
Àüü ºôµå ¿äûÀ» ó¸®ÇÏ´Â µ¥ ÇÊ¿äÇÑ ³í¸®´Â Ç÷¯±×Àο¡ °íÀ¯ÇÕ´Ï´Ù. ÇÁ·ÎÁ§Æ® °£¿¡ Á¾¼Ó¼ºÀÌ ÀÖÀ» °æ¿ì ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç ÀÚ¿øÀ» ¹æ¹®Çϰųª ´Ù¸¥ ÇÁ·ÎÁ§Æ®µµ °Ë»çÇØ¾ß ÇÕ´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº Àüü ºôµåÀÇ ±¸Çö ¹æ¹ýÀ» Á¦¾ÈÇÕ´Ï´Ù.
protected void fullBuild(final IProgressMonitor monitor) throws CoreException { try { getProject().accept(new MyBuildVisitor()); } catch (CoreException e) { } }
ºôµå ¹æ¹®Àڴ ƯÁ¤ ÀÚ¿ø¿¡ ´ëÇØ ºôµå¸¦ ¼öÇàÇÏ°í ¸ðµç ÇÏÀ§ ÀÚ¿øÀ» °è¼Ó ¹æ¹®Çϱâ À§ÇØ 'true'¸¦ ÀÀ´äÇÕ´Ï´Ù.
class MyBuildVisitor implements IResourceVisitor { public boolean visit(IResource res) { //build the specified resource. //return true to continue visiting children. return true; } }
¹æ¹® ÇÁ·Î¼¼½º´Â Àüü ÀÚ¿ø Æ®¸®¸¦ ¹æ¹®ÇÒ ¶§±îÁö °è¼ÓµË´Ï´Ù.
ÁõºÐ ºôµå¸¦ ¼öÇàÇÒ ¶§ ºô´õ´Â Àüü ÀÚ¿ø Æ®¸® ´ë½Å ÀÚ¿ø º¯°æ µ¨Å¸¸¦ »ç¿ëÇÕ´Ï´Ù.
protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { // the visitor does the work. delta.accept(new MyBuildDeltaVisitor()); }
¹æ¹® ÇÁ·Î¼¼½º´Â Àüü ÀÚ¿ø µ¨Å¸ Æ®¸®¸¦ ¹æ¹®ÇÒ ¶§±îÁö °è¼ÓµË´Ï´Ù. º¯°æ»çÇ×ÀÇ °³º° ¼Ó¼ºÀº ÀÚ¿ø º¯°æ ¸®½º³Ê ±¸Çö¿¡ ¼³¸íµÈ °Í°ú À¯»çÇÕ´Ï´Ù. ÇѰ¡Áö Áß¿äÇÑ Â÷ÀÌÁ¡Àº ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õÀÇ °æ¿ì ÀϹÝÀûÀ¸·Î Àüü ÀÛ¾÷°ø°£ÀÌ ¾Æ´Ñ ƯÁ¤ ÇÁ·ÎÁ§Æ®¸¦ ±â¹ÝÀ¸·Î ÇÏ´Â ÀÚ¿ø µ¨Å¸¸¦ »ç¿ëÇÏ¿© ÀÛ¾÷ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù.
Workbench¸¦ »ç¿ëÇÏ¸é »ç¿ëÀÚ°¡ ºôµå¸¦ ½ÃÀÛÇϱâ Àü¿¡ ÇÁ·ÎÁ§Æ® ¶Ç´Â ÇÁ·ÎÁ§Æ® ¼¼Æ®¸¦ Á¤¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ±â´ÉÀ¸·Î »ç¿ëÀڴ ƯÁ¤ ÇÁ·ÎÁ§Æ®ÀÇ ½ºÅ©·¡Ä¡¿¡¼¸¸ ´Ù½Ã ºôµå¸¦ °Á¦ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ºô´õ´Â ÀÌ ¸Þ¼Òµå¸¦ ±¸ÇöÇÏ¿© ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç ¹®Á¦Á¡ ¸¶Ä¿ ¹× ÆÄ»ýµÈ ÀÚ¿øÀ» Á¤¸®ÇØ¾ß ÇÕ´Ï´Ù.
ÁÖ¾îÁø ÇÁ·ÎÁ§Æ®¿¡ ºô´õ¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ·Á¸é ÇÁ·ÎÁ§Æ®ÀÇ ºôµå ½ºÆå¿¡ ÇØ´ç ºô´õ°¡ Æ÷ÇԵǾî¾ß ÇÕ´Ï´Ù. ÇÁ·ÎÁ§Æ®ÀÇ ºôµå ½ºÆåÀº ÇÁ·ÎÁ§Æ®°¡ ºôµåµÉ ¶§ ¼ø¼´ë·Î ½ÇÇàÇÒ ¸í·É ¸ñ·ÏÀÔ´Ï´Ù. °¢ ¸í·ÉÀº ÇϳªÀÇ ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ À̸§ ÁöÁ¤ÇÕ´Ï´Ù.
Âü°í: ºôµå ¸í·ÉÀÇ ºô´õ À̸§Àº ºô´õ È®ÀåÀÇ ¿ÏÀüÇÑ IDÀÔ´Ï´Ù. È®ÀåÀÇ ¿ÏÀüÇÑ ID´Â Ç÷¯±×ÀÎ ID¸¦ plugin.xml ÆÄÀÏÀÇ ´Ü¼ø È®ÀåÀÚ ID¿Í °áÇÕÇÏ¿© ÀÛ¼ºµË´Ï´Ù. ¿¹¸¦ µé¾î, "com.example.builders" Ç÷¯±×Àο¡¼ ´Ü¼ø È®ÀåÀÚ ID°¡ "mybuilder"ÀÎ ºô´õÀÇ À̸§Àº "com.example.builders.mybuilder"ÀÔ´Ï´Ù.
´ÙÀ½ ½º´ÏÆêÀº ±âÁ¸ÀÇ ºô´õ ¸ñ·Ï¿¡¼ »õ ºô´õ¸¦ ù ¹øÂ° ºô´õ·Î Ãß°¡ÇÕ´Ï´Ù.
final String BUILDER_ID = "com.example.builders.mybuilder"; IProjectDescription desc = project.getDescription(); ICommand[] commands = desc.getBuildSpec(); boolean found = false; for (int i = 0; i < commands.length; ++i) { if (commands[i].getBuilderName().equals(BUILDER_ID)) { found = true; break; } } if (!found) { //add builder to project ICommand command = desc.newCommand(); command.setBuilderName(BUILDER_ID); ICommand[] newCommands = new ICommand[commands.length + 1]; // Add it before other builders. System.arraycopy(commands, 0, newCommands, 1, commands.length); newCommands[0] = command; desc.setBuildSpec(newCommands); project.setDescription(desc, null); }
ÇÁ·ÎÁ§Æ® ºô´õ ±¸¼ºÀº ÇÁ·ÎÁ§Æ® ÀÛ¼º ½Ã ÇÑ ¹ø¸¸ ¼öÇàµË´Ï´Ù. ºô´õ¿Í ÇÁ·ÎÁ§Æ®¸¦ ¿¬°ü½ÃŰ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀº ÇÁ·ÎÁ§Æ® ¼Ó¼ºÀ» ±¸¼ºÇÏ´Â °ÍÀÔ´Ï´Ù.