ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ´Â ºôµå ÀÚü¿¡ ÀÇÇØ Á¤ÀǵǴ ¹æ½ÄÀ¸·Î ÇÁ·ÎÁ§Æ®ÀÇ ÀÚ¿øÀ» Á¶ÀÛÇÏ´Â ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù. ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ´Â ¶Ç´Ù¸¥ À¯ÇüÀÇ Ç׸ñ ¶Ç´Â ÀÚ¿øÀ» ÀÛ¼ºÇϱâ À§ÇØ ÀÚ¿ø¿¡ º¯È¯À» Àû¿ëÇÏ´Â µ¥ ÀÚÁÖ »ç¿ëµË´Ï´Ù.
Ç÷¯±×ÀÎÀº Ư¼ö ÀÚ¿ø º¯È¯À» ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï Ç÷§Æû¿¡ ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ Á¦°øÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, Ç÷§Æû SDK¿Í ÇÔ²² Á¦°øµÈ JDT(Java Development Tooling)¿¡¼´Â Java ÇÁ·ÎÁ§Æ®¿¡¼ ÆÄÀÏÀÌ Ãß°¡ ¶Ç´Â ¼öÁ¤µÉ ¶§¸¶´Ù Java ¼Ò½º ÆÄÀÏÀ» Ŭ·¡½º ÆÄÀÏ·Î ÄÄÆÄÀÏÇÏ°í º¯°æ»çÇ×ÀÇ ¿µÇâÀ» ¹Þ´Â ´Ù¸¥ ÆÄÀÏÀ» ÀçÄÄÆÄÀÏÇÏ´Â ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ Á¤ÀÇÇÕ´Ï´Ù.
Ç÷§ÆûÀº ´ÙÀ½ µÎ °¡Áö À¯ÇüÀÇ ºôµå¸¦ Á¤ÀÇÇÕ´Ï´Ù.
ÁõºÐ ºôµå´Â ÀÚ¿ø º¯°æ µ¨Å¸·Î ¼öÇàµË´Ï´Ù. µ¨Å¸´Â ºô´õ°¡ ÇÁ·ÎÁ§Æ®¸¦ ¸¶Áö¸·À¸·Î ºôµåÇÑ ÀÌÈÄ·Î ¸ðµç ÀÚ¿ø¿¡¼ º¯°æ»çÇ׿¡ ´ëÇÑ ÃÖÁ¾ °á°ú¸¦ ¹Ý¿µÇÕ´Ï´Ù. ÀÌ µ¨Å¸´Â ÀÚ¿ø º¯°æ À̺¥Æ® ³»¿¡¼ »ç¿ëµÇ´Â µ¨Å¸¿Í À¯»çÇÕ´Ï´Ù.
¿¹¸¦ µé¾î ºô´õ¸¦ ¼³¸íÇϸé ÀÌÇØÇϱ⠽±½À´Ï´Ù. JDT(Java Development Tooing)´Â º¯°æ»çÇ׿¡ ÀÇÇØ ¿µÇâÀ» ¹Þ´Â ÆÄÀÏÀ» ´Ù½Ã ÄÄÆÄÀÏÇϱâ À§Çؼ Java ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¿¡ ÀÇÇØ °¡µ¿µÇ´Â Java ÄÄÆÄÀÏ·¯¸¦ Á¦°øÇÕ´Ï´Ù. Àüü ºôµå°¡ Æ®¸®°ÅµÇ¸é, ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç .java ÆÄÀÏÀÌ ÄÄÆÄÀϵ˴ϴÙ. ¹ß»ýÇÑ ÄÄÆÄÀÏ ¹®Á¦Á¡Àº ¿µÇâÀ» ¹Þ´Â .java ÆÄÀÏ¿¡ ¹®Á¦Á¡ ¸¶Ä¿·Î Ãß°¡µË´Ï´Ù. ÁõºÐ ºôµå°¡ Æ®¸®°ÅµÇ¸é, Ãß°¡, º¯°æ ¶Ç´Â ¿µÇâÀ» ¹ÞÀº .java ÆÄÀÏÀ» ¼±ÅÃÀûÀ¸·Î ´Ù½Ã ÄÄÆÄÀÏÇÕ´Ï´Ù. ÀÌ .java ÆÄÀÏÀº ÀÚ¿ø µ¨Å¸¿¡ ¼³¸íµÇ¸ç ÇÊ¿äÇÒ °æ¿ì ¹®Á¦Á¡ ¸¶Ä¿¸¦ °»½ÅÇÕ´Ï´Ù. ´õ ÀÌ»ó ÀûÇÕÇÏÁö ¾ÊÀº .class ÆÄÀÏ ¶Ç´Â ¸¶Ä¿´Â Á¦°ÅµË´Ï´Ù.
ÁõºÐ ºôµå´Â ¼ö¹é ¶Ç´Â ¼öõ°³ÀÇ ÀÚ¿øÀ» °¡Áö°í ÀÖ´Â ÇÁ·ÎÁ§Æ®¿¡ ´ëÇØ ³ôÀº ¼º´É»óÀÇ ÀÌÁ¡À» Á¦°øÇϴµ¥ ´ëºÎºÐÀÇ ÀÚ¿øÀº ÁÖ¾îÁø ƯÁ¤ ½Ã°£¿¡ º¯°æµÇÁö ¾Ê½À´Ï´Ù.
ÁõºÐ ºôµåÀÇ ±â¼úÀû ¾î·Á¿òÀº ¾î¶² Ç׸ñÀ» ´Ù½Ã ºôµåÇØ¾ß ÇÏ´ÂÁö Á¤È®È÷ ÆÇº°ÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, Java ºô´õ¿¡ ÀÇÇØ À¯Áöº¸¼öµÇ´Â ³»ºÎ »óÅ¿¡´Â Á¾¼Ó¼º ±×·¡ÇÁ, º¸°íµÈ ÄÄÆÄÀÏ ¹®Á¦Á¡ ¸ñ·Ï µîÀÌ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀÌ Á¤º¸´Â ÁõºÐ ºôµå µ¿¾È Java ÀÚ¿ø º¯°æ¿¡ ÀÀ´äÇÏ¿© ´Ù½Ã ÄÄÆÄÀÏÇØ¾ß Çϴ Ŭ·¡½º¸¦ ½Äº°ÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù.
ºôµå ±âº» ±¸Á¶°¡ Ç÷§Æû¿¡ Á¤ÀǵDZä ÇÏÁö¸¸ ½ÇÁ¦ ÀÛ¾÷Àº Ç÷¯±×Àο¡¼ ¼öÇàµË´Ï´Ù. º¹ÀâÇÑ ÁõºÐ ºô´õ¸¦ ±¸ÇöÇϱâ À§ÇÑ ÆÐÅÏ¿¡ ´ëÇØ¼´Â ¿©±â¿¡¼ ¼³¸íÇÏÁö ¾Ê½À´Ï´Ù. °¢ ±¸ÇöÀº ƯÁ¤ ºô´õ ¼³°è¿¡ µû¶ó ´Ù¸£±â ¶§¹®ÀÔ´Ï´Ù.
´ÙÀ½ ¹æ¹ý Áß Çϳª¸¦ »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î ºô´õ¸¦ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
½ÇÁ¦·Î 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 } }
ºôµå 󸮴 build() ¸Þ¼Òµå·Î ½ÃÀÛÇϴµ¥, ÀÌ ¸Þ¼Òµå¿¡´Â ¿äûµÈ ºôµå À¯Çü(FULL_BUILD, INCREMENTAL_BUILD ¶Ç´Â AUTO_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 °£¿¡ Á¾¼Ó¼ºÀ» ¼±¾ðÇß¾î¾ß ÇÕ´Ï´Ù. ºô´õ¿¡ Á¾¼Ó¼ºÀÌ ¾øÀ¸¸é, ³Î¸¸ ¸®ÅÏÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÚ¼¼ÇÑ Á¤º¸´Â 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()); }
ÁõºÐ ºôµåÀÇ °æ¿ì ºôµå ¹æ¹®ÀÚ°¡ Àüü ÀÚ¿ø Æ®¸® ´ë½Å ÀÚ¿ø µ¨Å¸ Æ®¸®¸¦ »ç¿ëÇÏ¿© ÀÛ¾÷ÇÑ´Ù´Â Á¡À» Âü°íÇϽʽÿÀ.
¹æ¹® ÇÁ·Î¼¼½º´Â Àüü ÀÚ¿ø µ¨Å¸ Æ®¸®¸¦ ¹æ¹®ÇÒ ¶§±îÁö °è¼ÓµË´Ï´Ù. º¯°æ»çÇ×ÀÇ °³º° ¼Ó¼ºÀº ÀÚ¿ø º¯°æ ¸®½º³Ê ±¸Çö¿¡ ¼³¸íµÈ °Í°ú À¯»çÇÕ´Ï´Ù. ÇѰ¡Áö Áß¿äÇÑ Â÷ÀÌÁ¡Àº ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õÀÇ °æ¿ì ÀϹÝÀûÀ¸·Î Àüü ÀÛ¾÷°ø°£ÀÌ ¾Æ´Ñ ƯÁ¤ ÇÁ·ÎÁ§Æ®¸¦ ±â¹ÝÀ¸·Î ÇÏ´Â ÀÚ¿ø µ¨Å¸¸¦ »ç¿ëÇÏ¿© ÀÛ¾÷ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù.
ÁÖ¾îÁø ÇÁ·ÎÁ§Æ®¿¡ ºô´õ¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ·Á¸é ÇÁ·ÎÁ§Æ®ÀÇ ºôµå ½ºÆå¿¡ ÇØ´ç ºô´õ°¡ Æ÷ÇԵǾî¾ß ÇÕ´Ï´Ù. ÇÁ·ÎÁ§Æ®ÀÇ ºôµå ½ºÆåÀº ÇÁ·ÎÁ§Æ®°¡ ºôµåµÉ ¶§ ¼ø¼´ë·Î ½ÇÇàÇÒ ¸í·É ¸ñ·ÏÀÔ´Ï´Ù. °¢ ¸í·ÉÀº ÇϳªÀÇ ÁõºÐ ÇÁ·ÎÁ§Æ® ºô´õ¸¦ À̸§ ÁöÁ¤ÇÕ´Ï´Ù.
´ÙÀ½ ½º´ÏÆêÀº ±âÁ¸ÀÇ ºô´õ ¸ñ·Ï¿¡¼ »õ ºô´õ¸¦ ù ¹øÂ° ºô´õ·Î Ãß°¡ÇÕ´Ï´Ù.
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); }
ÇÁ·ÎÁ§Æ® ºô´õ ±¸¼ºÀº ÇÁ·ÎÁ§Æ® ÀÛ¼º ½Ã ÇÑ ¹ø¸¸ ¼öÇàµË´Ï´Ù.