`
liugang594
  • 浏览: 987602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Eclipse中的Builder与Nature

阅读更多

builder和nature是Eclipse中提供的两个扩展点。一般来说我们都是先有自己特定的project类型,然后在这类project上加上自定义的builder和nature。

 

其实所谓的特定的project通常都是由特有的nature来标识的;而又一般builder是建立在某类特定的project上,所以我们可以得出:Nature决定了project和builder。

 

下面简单介绍一下它们的使用。

 

一、扩展Nature

 

首先定义nature的扩展,如下:

   <extension
         id="nature"
         point="org.eclipse.core.resources.natures">
      <runtime>
         <run
               class="com.tibco.cdc.liugang.npb.LiugangProjectNature">
         </run>
      </runtime>
   </extension>

 

除此之处,nature还有一些其他的约束属性,具体的可以参见帮助。 

 

LiugangProjectNature的实现如下:

 

public class LiugangProjectNature implements IProjectNature {

	private IProject project;
	public static final String ID = "com.tibco.cdc.liugang.npb.nature";

	public void configure() throws CoreException {
	}

	public void deconfigure() throws CoreException {
	}

	public IProject getProject() {
		return project;
	}

	public void setProject(IProject project) {
		this.project = project;
	}
}

 

注意:nature的ID为plugin的ID加上nature扩展的ID. 

 

方法说明:

  • setProject()会在project.setDescription()的时候调用,如果那个project的description安了这个nature
  • configure()和deconfigure()方法会在nature安上和卸掉的时候调用,一会我们可以看到builder在其中是怎么用的。
  • setProject()和configure()的调用顺序是先调setProject()后调configure().

二、生成Project

 

有了nature,下面就可以创建一个project,并把这个nature加到这个project上,如下 :

 

			IWorkspace workspace = ResourcesPlugin.getWorkspace();
			IWorkspaceRoot root = workspace.getRoot();
			
			String projectName = "TestNPB";
			IProject project = root.getProject(projectName);
			if (!project.exists()) {
				project.create(null);
				project.open(null);
			}
			IProjectDescription description = project.getDescription();
			ProjectUtil.addNature2Project(description, new String[]{LiugangProjectNature.ID}, null);
			project.setDescription(description, null);

 

这里,我写了一个通用类来处理nature,builder的增加和删除,我们先看这个addNature2Project()方法:

	public static void addNature2Project(IProjectDescription description, String[] natureIds,
			IProgressMonitor monitor) throws CoreException {
		String[] prevNatures = description.getNatureIds();
		String[] newNatures = new String[prevNatures.length + natureIds.length];
		System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
		for(int i = prevNatures.length;i<newNatures.length;i++){
			newNatures[i] = natureIds[i-prevNatures.length];
		}
		description.setNatureIds(newNatures);
	}

 

 

三、定义Builder

 

按最初我们说的,builder一般安装在具有某种特定nature的project上。这里我们定义一个builder的扩展,然后再修改一下nature的扩展。分别如下:

Nature:

<extension
         id="nature"
         point="org.eclipse.core.resources.natures">
      <runtime>
         <run
               class="com.tibco.cdc.liugang.npb.LiugangProjectNature">
         </run>
      </runtime>
      <builder
            id="com.tibco.cdc.liugang.npb.builder">
      </builder>
   </extension>

 Builder:

<extension
      id="builder"
      point="org.eclipse.core.resources.builders">
   <builder
         callOnEmptyDelta="true"
         hasNature="true"
         isConfigurable="false">
      <run
            class="com.tibco.cdc.liugang.npb.LiugangIncrementalProjectBuilder">
      </run>
   </builder>
</extension>

 

回到代码,这里假设builder由nature控制。所以builder的安装与卸载分别在nature的configure()方法和deconfigure()方法中实现,如下:

 

	public void configure() throws CoreException {
		IProjectDescription description = project.getDescription();
		ProjectUtil.addBuilderToProject(description,
				new String[] { LiugangIncrementalProjectBuilder.ID }, null);
		project.setDescription(description, null);
	}

	public void deconfigure() throws CoreException {
		IProjectDescription description = project.getDescription();
		ProjectUtil.removeBuilderFromProject(description,
				new String[] { LiugangIncrementalProjectBuilder.ID }, null);
		project.setDescription(description, null);
	}

 

 

其中ProjectUtil中的实现如下:

	public static void addBuilderToProject(IProjectDescription description,
			String[] builderIds, IProgressMonitor monitor) throws CoreException {
		ICommand[] buildSpec = description.getBuildSpec();
		ICommand[] newBuilders = new ICommand[buildSpec.length
				+ builderIds.length];
		System.arraycopy(buildSpec, 0, newBuilders, 0, buildSpec.length);
		for (int i = buildSpec.length; i < newBuilders.length; i++) {
			ICommand command = description.newCommand();
			command.setBuilderName(builderIds[i - buildSpec.length]);
			newBuilders[i] = command;
		}
		description.setBuildSpec(newBuilders);
	}

	public static void removeBuilderFromProject(
			IProjectDescription description, String[] builderIds,
			IProgressMonitor monitor) {
		ICommand[] buildSpec = description.getBuildSpec();
		List<ICommand> newBuilders = new ArrayList<ICommand>();
		for (ICommand command : buildSpec) {
			boolean find = false;
			for (String id : builderIds) {
				if (command.getBuilderName().equals(id)) {
					find = true;
					break;
				}
			}
			if (!find) {
				newBuilders.add(command);
			}
		}
		description.setBuildSpec(newBuilders.toArray(new ICommand[0]));
	}

 

这样完成了nature和builder的增加。最后,我们稍稍看一下builder的实现。

 

四、builder的实现

 

对于builder的实现来说,我们通常关心以下几个方法:

public class LiugangIncrementalProjectBuilder extends IncrementalProjectBuilder {

	public static final String ID = "com.tibco.cdc.liugang.npb.builder";
	
	public LiugangIncrementalProjectBuilder() {
	}

	@Override
	protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
			throws CoreException {
		return null;
	}

	@Override
	protected void clean(IProgressMonitor monitor) throws CoreException {
		super.clean(monitor);
	}

	@Override
	protected void startupOnInitialize() {
		super.startupOnInitialize();
	}

}

 

 

build()方法中,一般会根据不同的build类型,来实现不同的build策略,例如:

	@Override
	protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
			throws CoreException {

		switch (kind) {
		case FULL_BUILD:
			processFullBuild(monitor);
			break;

		default:
			IResourceDelta delta = getDelta(project);
			if (delta == null) {
				processFullBuild(monitor);
			} else {
				processIncrementalBuild(delta, monitor);
			}
			break;
		}

		return null;
	}

 

clean()方法,在clean动作执行时被调用,通常用于清理之前build的信息,然后build()方法会被调用。clean()方法通常可以如下实现:

	@Override
	protected void clean(IProgressMonitor monitor) throws CoreException {
		super.clean(monitor);

		/*
		 * remove all build files
		 */
		IFolder outputFiles = project.getFolder(FILES_OUTPUT_PATH);
		outputFiles .refreshLocal(IResource.DEPTH_INFINITE, monitor);
		if (outputFiles .exists()) {
			outputFiles .delete(true, monitor);
		}
	}

 

 startupOnInitialize()可以调用一些初始信息,或者初始变量,例如上面用到的project变量就可以如下:

	@Override
	protected void startupOnInitialize() {
		super.startupOnInitialize();
		this.project = getProject();
	}

 

这样,一个完整的nature,builder的添加处理过程就实现了。 

分享到:
评论
1 楼 china_volcano 2013-07-08  
请问:怎么创建一个web工程?

相关推荐

    向eclipse中导入外部项目

    (2)然后修改 Eclipse 工程下的 .project 文件:在 &lt;natures&gt; &lt;/natures&gt; 中加入 &lt;nature&gt;org.eclipse.wst.common.project.facet.core.nature&lt;/nature&gt;、&lt;nature&gt;org.eclipse.wst.common.modulecore....

    把外部项目导入eclipse

    &lt;name&gt;org.eclipse.wst.common.project.facet.core.builder &lt;name&gt;org.eclipse.wst.validation.validationbuilder ... ``` 然后,刷新项目,选择 Java 1.6 和 Dynamic Web Module 2.5,点击 OK。 ...

    Eclipse插件开发培训_资源管理(入门).ppt

    综上所述,Eclipse的资源管理是构建插件和应用程序的基础,它提供了丰富的API,使开发者能够高效地处理项目中的文件和目录,跟踪变化,管理状态,并与其他Eclipse功能如Builder、Nature和Marker紧密集成。...

    myeclipse工程转eclipse工程

    &lt;name&gt;org.eclipse.wst.common.project.facet.core.builder &lt;name&gt;org.eclipse.wst.validation.validationbuilder ``` 3. **重新打开项目**:通过File -&gt; Import -&gt; General -&gt; Existing Projects...

    myeclipse项目转换成eclipse

    MyEclipse与Eclipse都是广泛使用的Java开发工具,尽管它们都基于Eclipse平台构建,但在项目结构和配置上存在一定的差异。MyEclipse项目中的Web工程通常使用`WebRoot`作为其根目录,而Eclipse则默认使用`WebContent`...

    Eclipse插件开发扩展点大全(中文)

    开发Eclipse插件时,理解并熟练使用这些扩展点是至关重要的,因为它们决定了插件的功能范围和与Eclipse核心的集成程度。通过深入学习和实践,开发者可以构建出满足特定需求的定制化开发环境,提升工作效率。

    Eclipse开发Android源码

    &lt;nature&gt;org.eclipse.jdt.core.javanature&lt;/nature&gt; ``` 3. **修改Eclipse配置**: - **调整Eclipse内存设置**:为了处理大型的源码项目,需要增大Eclipse的内存分配。在eclipse.ini文件中,修改`-Xms`, `-...

    MyEclipse Web工程 完美移植到Eclipse WTP

    `&lt;name&gt;org.eclipse.wst.common.project.facet.core.builder&lt;/name&gt;` `&lt;arguments&gt;` `&lt;/arguments&gt;` - `&lt;buildCommand&gt;` `&lt;name&gt;org.eclipse.wst.validation.validationbuilder&lt;/name&gt;` `&lt;arguments&gt;` `...

    Eclipse平台扩展点清单

    本文将详细介绍 Eclipse 平台中的多个关键扩展点及其作用,帮助开发者更好地理解和利用 Eclipse 的扩展能力。 #### 二、核心扩展点 **1. org.eclipse.core.contenttype.contentTypes** 此扩展点用于定义新的内容...

    Flex Builder3+FDT3 环境配置及设置

    5. **安装Flex Builder 3插件**:在Eclipse中,通过`Help` -&gt; `Software Updates` -&gt; `Find and Install` -&gt; `Search for new features to install`,然后输入FDT的更新地址`http://fdt.powerflasher.com/update`,...

    Java开发入行真功夫 光盘 源代码

    Java开发入行真功夫 光盘 源代码 , &lt;name&gt;ch14 &lt;comment&gt;&lt;/comment&gt; &lt;name&gt;org.eclipse.jdt.core.javabuilder ... &lt;nature&gt;org.eclipse.jdt.core.javanature&lt;/nature&gt; &lt;/projectDescription&gt;

    Eclipse导入问题整理以及解决方案

    &lt;name&gt;org.eclipse.jdt.core.javabuilder &lt;arguments&gt;&lt;/arguments&gt; &lt;name&gt;com.android.ide.eclipse.adt.ApkBuilder&lt;/name&gt; &lt;arguments&gt;&lt;/arguments&gt; &lt;nature&gt;...

    Java swing mysql(Oracle)实现的飞机订票系统项目

    &lt;name&gt;plane &lt;comment&gt;&lt;/comment&gt; &lt;name&gt;org.eclipse.jdt.core.javabuilder &lt;nature&gt;org.eclipse.jdt.core.javanature&lt;/nature&gt; &lt;/projectDescription&gt;

    struts2 代码

    2. `.project`:这是Eclipse项目的配置文件,包含了项目的属性,如构建路径、Nature(项目特性)和Builder(构建器)。在Struts2项目中,它可能会包含Struts2插件的Nature,确保IDE能够理解和处理Struts2特定的配置...

    Flex+Elipse+blazeDS+tomcat部署.pdf

    7. **Flex Builder 3 Eclipse Plugin**:这是一个Eclipse插件,用于在Eclipse环境中集成Flex开发功能,提供代码编辑、调试和构建工具,便于与Java后端整合。 8. **Dynamic Web Project**:在Eclipse中创建的动态Web...

    班级管理系统

    &lt;?xml version="1.0" encoding="UTF-8"?&gt; 信管1班班级管理系统(单机版) &lt;comment&gt; ... &lt;name&gt;org.eclipse.jdt.core.java... &lt;nature&gt;org.eclipse.jdt.core.javanature&lt;/nature&gt; &lt;/projectDescription&gt;

    aszip源代码

    【.project】文件是Eclipse或Flash Builder项目的元数据文件,定义了项目的结构、构建路径、nature(项目类型)等信息,使得IDE可以识别和管理项目。 【.flexLibProperties】文件是Flex项目的特定属性文件,它记录...

    androidtest.7z

    3. `.project` 文件是Eclipse项目的元数据,包含了项目的构建信息、Natures(比如Android Nature)和Builders(比如ADT Builder)等设置。 4. `project.properties` 文件记录了项目的属性,如目标Android版本和其他...

Global site tag (gtag.js) - Google Analytics