- 浏览: 978135 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个wsdl 地址 可以访问?
[CXF] Server与Client实现方式五:HTTPS -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
[CXF] Server与Client实现方式四:JMS -
dengmiao:
JAXB学习三 (验证) -
panamera:
你好。可以提供maven pom配置是怎么配置的?不知道你使用 ...
[CXF] Server与Client实现方式四:JMS -
u010221220:
请问楼主一二三部分的代码都应该放在哪个函数体中。
使用JDI监听Java程序运行
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的添加处理过程就实现了。
发表评论
-
在OSGI容器Equinox中嵌入HttpServer
2011-12-27 18:01 10702简单介绍一下如何在一个osgi的bundle中内嵌使用http ... -
GEF中用鼠标移动画布
2011-12-27 13:37 1320第一步 增加Palette项: moveTool = n ... -
在Eclipse中使用Maven
2011-09-29 13:41 1230上一篇讲了Maven的基础知识,这一篇讲怎么在Eclipse里 ... -
增加Table的Column右键菜单
2011-03-15 15:55 1440table.addListener(SWT.MenuDete ... -
RGB与HSB之间的相互转换
2010-10-29 15:14 12271[引用:] [ http://www.missyuan.com ... -
给Table和Tree的Header加右键菜单
2010-10-29 11:26 2462通常,如果不做特殊处理的话,在表头(树头,以下统称表头)的上点 ... -
给Editor加上Annotation
2010-10-27 17:27 2693要自定义Annotation,需要实现以下扩展点: “ ... -
org.eclipse.ui.navigator.linkHelper的使用
2010-08-06 15:43 2382org.eclipse.ui.navigator.linkHe ... -
让表项支持鼠标拖动移位,并自动滚动滚动条
2010-04-07 11:43 2637设想我们有一个表,表中有很多数据(多到竖起滚动条至少要出现)。 ... -
Eclipse截屏插件
2010-01-19 15:59 2676闲来无事,就写了一个截屏插件,见附件,直接放在eclipse的 ... -
Eclipse取得路径的方法
2009-11-27 10:30 1862从插件中获得绝对路径: TestPlug ... -
实现自己的团队协作客户端一
2009-11-12 15:04 1386在Eclipse里自带了团队协 ... -
扩展Eclipse Java编辑器的链接功能
2009-09-09 09:35 3579在JDT中,可以在一个类,或者是方法,或者是变量上进行跳转。这 ... -
添加监听到EMF对象、加密保存
2009-08-14 10:10 957一、可以注册监听来获取EMF模型改变事件,例如: pu ... -
使用Tab键实现表格的跳转
2009-08-12 21:29 2928在Excel中,如果按Tab键,则焦点会在相邻的方格中不断的跳 ... -
StyledCellLabelProvider的应用
2009-08-11 16:47 2235昨天写了EditingSupport的应用,可以方便的编辑Ta ... -
EditingSupport的应用
2009-08-10 15:20 2921Eclipse3.3中提供了一个EditingSupport类 ... -
合理的自定义扩展点
2009-06-26 01:43 1763Eclipse中提供了各种各样的用于扩展Eclipse功能的 ... -
关键字高亮插件
2009-06-26 00:59 1883在eclipse中,如果用Ctrl+F来进行查找,它只会一个一 ... -
置窗口于显示器中央
2009-05-06 09:46 888要把窗口置于显示器的中央,也是很容易的。如下: ...
相关推荐
Eclipse可视化开发之windowBuilder插件,eclipse插件,为2019-07-16当前最新版的WindowBuilder插件>>repository.zip,该插件为离线安装, 以下为安装步骤: 离线安装说明 1,把下载的windowbuilder.zip,解压出...
JRE 8 + JAVAFX + scenebuilder已经被作者配置好并压缩至压缩包中,不需要额外配置环境(包括下载scenebuilder和在eclipse中下载JAVAFX),但gson安装包需要额外配置,这方面老师应该会讲。使用此压缩包只要打开...
在Eclipse中用windowbuilder插件开发的界面程序,记事本,双击可运行,要求jdk1.7/1.8及以上 谢谢各位网友的关注,我继续努力~
windowbuilder eclipse设置
解压后,直接eclipse 中help安装 选择本地目录即可,就是等待验证整时间比较长,亲测可用。还有一个快速的方法: 1)eclipse安装目录下新建WB_v1(文件夹名任意) 2)eclipse安装目录下新建(若有无需新建)links ...
eclipse上开发swt中所要用到的Windowsbuilder插件
该文件为Eclipse的插件,名为Window Builder,可以使用拖拽控件来进行图形界面的开发
WindowsBuilder是eclipse的一个插件,安装此插件可以帮助我们快速的创建窗口程序。
Eclipse 安装 Windowbuilder 插件.doc
纯净的eclipse4.8+与之匹配的windowbuilder1.9,260多M,分成3个卷
WindowBuilder for eclipse 4.2 WindowBuilder是一款基于Eclipse平台的双向Java的GUI设计插件式的软件。具备SWT/JFACE开发、Swing开发及GWT 开发三大功能,是一款不可多得的Java体系中的WYSIWYG工具。
Eclipse3.5集成Flex_Builder3或Flash_Builder4
Window.Builder.Pro.v7.4.0 注册机 for Eclipse 3.5
纯净的eclipse4.8打了与之匹配的swing插件windowbuilder1.9。较大,260多M,只能分了3个卷
WindowBuilder是一款基于Eclipse平台的双向Java的GUI设计插件式的软件。具备SWT/JFACE开发、Swing开发及GWT 开发三大功能,是一款不可多得的Java体系中的WYSIWYG工具。 WindowBuilder的主要用户界面构建为: Design...
Eclipse的WindowBuilder离线版,直接安装就可以了,在线安装慢的可以下这个,注视是for eclipse 3.8的
快速开发图形界面SWT/JFace eclipse图形设计插件
最新 windowbuilder pro 6.8 含注册机 eclipse RCP 开发必备利器 第一个压缩包(共计3个压缩包)
WindowBuilder for eclipse3.7.第二卷(共两卷)
介绍了在eclipse中安装WindowsBuilder插件的正确方法,最新版