Eclipse插件开发Nature篇

  • 介绍
本文将介绍如何创建自己的项目特性(nature)。什么是项目特性呢?比如你新建一个Java工程,这个项目的图标右上角就会有个J的标志;如果是个Maven工程呢,在左上角还有有一个M标志。简单来说,项目特性就是用来对不同项目的区分。Nature会关联Builder,那什么是Builder呢? 当你保存Java源文件的同时,就会触发编译动作。这个事情就是Builder来做的。所以说,你的Java工程到底能不能成功编译,责任都落在了Nature和Builder的配合上。比如:你导入了Maven工程,却始终无法生成Maven的依赖,所以也无法编译,这时候你就可以看看你的工程上有没有关联Maven对应的Nature。
  • 步骤
在plugin.xml文件中添加如下配置: [codesyntax lang="xml"]
<extension
 point="org.eclipse.core.resources.natures">
 <runtime>
 	<run class="org.suren.littlebird.SuRenProjectNature" />
 </runtime>
</extension>
<extension id="suren.builder" name="SuRenBuilder"
 point="org.eclipse.core.resources.builders">
 <builder>
 	<run class="org.suren.littlebird.builder.SuRenBuilder" />
 </builder>
</extension>
[/codesyntax] 实现org.eclipse.core.resources.IProjectNature接口中的方法 [codesyntax lang="java"]
package org.suren.littlebird.nature;

import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.CoreException;

/**
 * @author suren
 * @date 2015-4-2
 *
 * http://surenpi.com
 */
public class SuRenProjectNature implements IProjectNature
{
	private static final String SUREN_BUILDER_ID = "suren.builder";

	/**
	 * 工程对象
	 */
	private IProject project;

	/**
	 * 当nature被添加到工程中时调用,配置当前工程
	 */
	@Override
	public void configure() throws CoreException
	{
		if(project == null)
		{
			System.err.println("can not get project object when nature configure.");

			return;
		}

		IProjectDescription projectDesc = project.getDescription();
		ICommand[] buildSpec = projectDesc.getBuildSpec();

		boolean builderSetup = false;
		for(ICommand cmd : buildSpec)
		{
			if(cmd.getBuilderName().equals(SUREN_BUILDER_ID))
			{
				builderSetup = true;
				break;
			}
		}

		if(!builderSetup)
		{
			ICommand newCmd = projectDesc.newCommand();
			newCmd.setBuilderName(SUREN_BUILDER_ID);

			ICommand[] newBuildSpec = new ICommand[buildSpec.length + 1];
			newBuildSpec[0] = newCmd;

			System.arraycopy(buildSpec, 0, newBuildSpec, 1, buildSpec.length);
			projectDesc.setBuildSpec(newBuildSpec);
			project.setDescription(projectDesc, null);
		}
	}

	/**
	 * 当nature从当前工程中取消时,删除配置
	 */
	@Override
	public void deconfigure() throws CoreException
	{
		if(project == null)
		{
			System.err.println("can not get project object when nature deconfigure.");

			return;
		}

		IProjectDescription projectDesc = project.getDescription();
		ICommand[] buildSpec = projectDesc.getBuildSpec();

		int prepareToRemove = -1;
		for(int i = 0; i < buildSpec.length; i++)
		{
			ICommand cmd = buildSpec[i];
			if(cmd.getBuilderName().equals(SUREN_BUILDER_ID))
			{
				prepareToRemove = i;
				break;
			}
		}

		if(prepareToRemove != -1)
		{
			ICommand[] newBuildSpec = new ICommand[buildSpec.length - 1];

			System.arraycopy(buildSpec, 0, newBuildSpec, 0, prepareToRemove + 1);
			System.arraycopy(buildSpec, prepareToRemove + 1,
					newBuildSpec, prepareToRemove, buildSpec.length - prepareToRemove - 1);
			projectDesc.setBuildSpec(newBuildSpec);
			project.setDescription(projectDesc, null);
		}
	}

	/**
	 * 从nature中获取当前工程
	 */
	@Override
	public IProject getProject()
	{
		return this.project;
	}

	/**
	 * 在nature中保存当工程
	 */
	@Override
	public void setProject(IProject project)
	{
		this.project = project;
	}

}
[/codesyntax] 继承org.eclipse.core.resources.IncrementalProjectBuilder [codesyntax lang="java"]
package org.suren.littlebird.builder;

import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * @author suren
 * @date 2015-4-2
 *
 * http://surenpi.com
 */
public class SuRenBuilder extends IncrementalProjectBuilder
{

	@Override
	protected IProject[] build(int kind, Map<String, String> args,
			IProgressMonitor pro) throws CoreException
	{
		System.out.println("prepare to suren build.");

		switch(kind)
		{
			case IncrementalProjectBuilder.FULL_BUILD:
				System.out.println("full suren build.");
				getProject().accept(new SuRenVistor());

				break;
			default:
				IResourceDelta delta = getDelta(getProject());
				if(delta == null)
				{
					getProject().accept(new SuRenVistor());
				}
				else
				{
					delta.accept(new SuRenDeltaVisitor());
				}

				break;
		}

		System.out.println("suren build done.");

		return null;
	}

	private class SuRenVistor implements IResourceVisitor
	{

		@Override
		public boolean visit(IResource resource) throws CoreException
		{
			System.out.println("SuRenVistor");

			switch(resource.getType())
			{
				case IResource.PROJECT:
					System.out.println("PROJECT added: " + resource.getName());
					break;
				case IResource.FOLDER:
					System.out.println("FOLDER added: " + resource.getName());
					break;
				case IResource.FILE:
					System.out.println("FILE added: " + resource.getName());
					break;
			}

			return true;
		}
	}

	private class SuRenDeltaVisitor implements IResourceDeltaVisitor
	{

		@Override
		public boolean visit(IResourceDelta delta) throws CoreException
		{
			IResource resource = delta.getResource();
			switch(resource.getType())
			{
				case IResource.PROJECT:
					System.out.println("PROJECT added: " + resource.getName());
					break;
				case IResource.FOLDER:
					System.out.println("FOLDER added: " + resource.getName());
					break;
				case IResource.FILE:
					System.out.println("FILE added: " + resource.getName());
					break;
			}

			switch(delta.getKind())
			{
				case IResourceDelta.ADDED:
					System.out.println("ADDED : " + resource.getName());
					break;
				case IResourceDelta.CHANGED:
					System.out.println("CHANGED : " + resource.getName());
					break;
				case IResourceDelta.REMOVED:
					System.out.println("REMOVED : " + resource.getName());
					break;
			}

			return true;
		}
	}

}
[/codesyntax]
  • 工程特性图标
[codesyntax lang="xml"]
<extension
	point="org.eclipse.ui.ide.projectNatureImages">
	<image
		id="suren.nature.image"
		icon="icons/suren.gif"
		natureId="suren.nature">
	</image>
</extension>
[/codesyntax] 图标尺寸:7*6 在plugin.xml中加入上面的代码后,工程图标的右上角就会显示你的图标。
  • 参考
还没看过“Eclipse插件开发HelloWorld篇”?那赶紧先看看吧。 不知道Nature和Builder的实际作用?嗯,你要是再整一个“向导”出来就明白了。 http://blog.csdn.net/soszou/article/details/8030111

转载于:https://my.oschina.net/surenpi/blog/604832

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值