Builder
builder是Eclipse为用户提供的随资源发生变化扩展自定义行为的接口
一、扩展org.eclipse.core.resources.builders
在build(int kind, Map args, IProgressMonitor monitor)中做build过程中要做的事情,kind表示build类型
- Project->Build 为选中的project调用build方法,传入的kind为INCREMENTAL_BUILD
- Project->Build All 为所有打开project调用build方法,传入kind为INCREMENTAL_BUILD
- 如果自上次调用build开始没有发生变化,则再次调用点击Build不会有build被调用,次机制有Eclipse提供
- Project->Clean为选中的project调用build方法,传入的kind为FULL_BUILD
- Project->Build Automatically,资源发生变更时,Eclipse调用build方法,传入的kind为AUTO_BUILD
二、为项目添加加builder
将自定义builder的hasNature设置为false
- 手动方式:
- 打开需要添加builder的项目的.project文件
- 增加节点
<buildCommand>
<name>com.uniquesoft.mint.test.mintTestBuilder</name>
<arguments>
</arguments>
</buildCommand> -
关闭项目然后重新打开
- Note: name值必须是builder所属插件的ID+"."+builder的name的ID,即builder的全名
- 程序方式:
- 获得项目的buildCommand信息
- 增加buildCommand节点
Note:程序方式与手动方式基本相同,区别在于通过程序方式增加后不需要重新打开项目
三、激活builder
- menu:Project->Build (All/Automatically)
- 通过程序:IProject.build和IWorksapce.build
- 项目打开时
Marker
一、扩展org.eclipse.core.resources.markers
- super:添加一个已有marker作为super,可以使得自定义的marker具有此super marker的特性,例如指定org.eclipse.core.resources.problemmarker作为super,自定义的marker就可以在problem view中显示相关信息
- persistent 是否支持跨session(不同的Eclipse运行实例)
- false:产生的makers在Eclipse中期之后不会再现
- true:产生的makers在Eclipse中期之后会重现
- attribute
Note:marker的标识符必须是他所属的插件的ID+"."+marker的ID
二、创建marker
IResource.createMarker(markerID) //full ID
三、为maker创建Resolutions
扩展org.eclipse.ui.ide.markerResolution,根据Eclipse提示实现IMarkerResolutionGenerator2接口
- hasResolutions(IMarker marker)
自定义ResolutionGenerator通过override hasResolutions方法决定是否为某些特定的marker创建resolution :
上述代码为MISSING_KEY_VIOLATION 和 UNUSED_KEY_VIOLATION创建resolution
- getResolutions(IMarker marker)
自定义ResolutionGenerator通过override getResolutions方法决定如何为特定的marker提供resolution
Note:两个方法必须相结合才能为marker成功创建resolution,首先在hasResolutoins中为特定的marker返回true,然后在getResolutions中为此marker创建Resolution
Nature
Builder and Nature is used to extend the behavior of certain projects
Marker is used to extend the behavor of certain resources
一、扩展 org.eclipse.core.resources.natures
Nature 管理了一组Builder,可以将这些builder用于特定的项目,将Nature加入项目,就是意味着将这些builder都加入到此项目
- 为Nature指定需要管理的builder: 增加builder节点,指向相应的builder
- 为Nature增加需要管理的buidler:
- 增加runtime节点,实现IProjectNature接口
- setProject() 在Nature加入到特定的项目(IProject.getDescription().setNatureIds())时调用此方法,然后configure被调用,将buidler的添加放入此方法; deConfigure在删除Nature是调用 对builder的删除和marker的删除这个方法中
- 将Nature关联到项目
- 找到项目的description
- 通过descripion.setNatureIds将Nature加入到项目中
Note:favorite example中,需要把两个require-nature去掉才能成功运行