八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  232 随笔 :: 0 文章 :: 3016 评论 :: 11 Trackbacks

上一篇里我们为一个普通的Eclipse插件添加了Application扩展,剩下来的工作就很简单了,甚至不需要再编写一行代码。在 Eclipse 3.1里,把具有Application的插件包装成RCP并输出的过程是通过建立产品配置文件(Product Configuration)来完成的。

在主菜单选择File->New->Other命令,在对话框里选择新建一个产品配置文件,这个文件可以建立在任何位置,为方便起见我 们就把它放在需要转换为RCP的插件的主目录下好了。产品配置文件是一个xml格式的文件,不过Eclipse 3.1提供了一个编辑器界面来编辑它的内容,所以不用像以前那样记住所有的tag了。这个编辑器分为三个页面:Overview、 Configuration和Branding。

首先在Overview页面指定产品的ID,按下“Product ID”右边的“New...”按钮,在对话框里输入插件的ID、新的产品ID以及缺省的Application的ID,见图1。关闭对话框后,选择一个要 运行的Application,并填写产品名称。下面有一个选项让你选择产品基于plug-in还是feature,feature是多个插件的集合,如 果只包含一个插件,选择基于plug-in即可;如果包含多个插件,利用feature可以让这些插件按功能分类,便于管理,建议使用基于feature 的方式,不过你要先建立feature才行。


图1 新建Product ID对话框

然后,来到Configuration页面,先把我们的插件添加到左边的插件列表里(如果前面选择了基于features方式,这里是 feature列表),再按“Add Required Plug-ins”按钮让Eclipse自动添加被依赖的其他插件。config.ini文件的作用是设置了一些变量值,RCP程序运行时会根据它们改变 一些外观或行为,例如可以在这里规定透视图切换器的停靠位置(org.eclipse.ui/DOCK_PERSPECTIVE_BAR=left)等 等;在页面的右下方可以设置一些运行参数。


图2 选择需要的插件

最后翻到Branding页面,这个页面的功能就是定制一些外观元素,例如启动时显示的splash图像,将想显示的图像以 “splash.bmp”命名保存到插件的根目录下,然后在“Splash Screen”里指定这个插件ID即可;定制窗口的图标,包括16x16和32x32两种格式,都是.gif文件;还有就是“关于...”对话框里的图片 和文字,根据自己的需要填写即可。启动器名称(Launcher Name)就是启动RCP的命令名称,在Linux里是一个脚本文件,在Windows里则是一个.exe文件。还可以定制启动器的图标,由于时间关系我 的例子里省去了这个定制项目。

需要注意一点,这些图像无论放在哪个目录里(比如icons目录)都应该确保会被输出到产品里,否则运行产品时会看不到它或看到红色的小方块,方法是在插件的build.properties编辑器里勾选需要输出的文件和目录。

上面这些都配置好以后,回到Overview页面,先点击“Launch the product”看一下产品运行后的效果,确认没有问题后,就可以点击“Eclipse Product export wizard”输出你的产品了,在弹出的对话框里填写要输出的位置,可以选择输出为目录或是打包为单个文件(.zip格式),见图3。


图3 输出产品

输出后最好再确认一下运行效果,如果和刚才有所不同,则很可能是build.properties写的有些问题,请仔细检查。

怎么样,很容易吧!

posted on 2006-01-16 16:42 八进制 阅读(4305) 评论(27)  编辑 收藏 所属分类: EclipseRCP

评论

以前插件模式下开发的时候那些讨厌的菜单项总是去不掉,按照你写的教程果然不一样了,就剩下一个“文件”——“退出”了!可是还有一些想保留,比如以前的“窗口”——“复位透视图”,因为如果不小心关掉一个视图就再也没有办法打开了:(,这个你知道怎么办吗?
记得以前给你发过mail呢,真是个大好人,有问必回!真是非常感谢啊,都想拜你为师了:P
  回复  引用    

请问,怎样把一个已经存在的eclipse插件(例如,CDT)加入到一个RCP中呢?
  回复  引用    

#3楼  2006-04-17 10:37 huff [未注册用户]
请问如何直接创建自己的Editor,而不必通过创建.GefPractice文件,
RCP中好像可以实现,能否给个思路?
  回复  引用    

#4楼 [楼主] 2006-05-12 10:34 八进制      
To vivianguopp: 想保留的菜单可以在ActionBarAdvisor里添加,ActionFactory类里有一些Workbench自带的菜单项。另外有一些菜单需要某些插件的支持,例如Format代码的菜单会在JDT插件里。

To 泽牛内尔: 本质上没有什么区别,RCP是简化的Workbench。

To huff: IWorbenchPage.openEditor可以打开一个editor,当然要提供editorInput和editorId作为参数。
  回复  引用  查看    

#5楼  2006-08-19 16:30 pandawang [未注册用户]
八进制,你好,我直接将你的gefpractice插件引入一个rcp工程中,并打开编辑器,大部分可以正常运行,但不能删除(使用delete键)node和connection.怀疑是因为rcp中没有注册相应的RetargetAction,如果真是这样,请问应该如何注册呢,在actionbaradviser中么,如果不是,那是怎么回事呢?谢谢
  回复  引用    

#6楼  2006-08-19 16:52 pandawang [未注册用户]
我试了一下,解决了,确实是需要在相应rcp工程中的ActionBarAdviser中注册相应的Action,比如对应于deleteAction,我在方法org.eclipse.ui.application.ActionBarAdvisor#makeAction(IWorkbenchWindow)中注册deleteAction,如下:
protected void makeAction(final IWorkbenchWindow window){
IAction delAction = ActionFactory.DELETE.create(window);
register(delAction);
}
此外,在我自己做的基于rcp的gef编辑器中,只是这么设置还是不能删除相应的图形元素,需要在相应的编辑器中重载init方法,添加如下的代码
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
// TODO Auto-generated method stub
super.init(site, input);
ActionRegistry registry = getActionRegistry();
IActionBars bar = site.getActionBars();
String id = ActionFactory.DELETE.getId();
bar.setGlobalActionHandler(id, registry.getAction(id));
bar.updateActionBars();
}
这个代码也是从你的gefpractice中找到的,不过不是在编辑器中,而在重载方法
org.eclipse.gef.ui.parts.ContentOutlinePage#init(IPageSite)中,但我估计应该是起到相同的作用.
再次表示感谢.
  回复  引用    

#7楼  2006-09-05 16:59 bloom [未注册用户]
请问,我选择建一个产品配置文件,不过在Product Configuration那一页面选完后是,还是不能按"Finish",是怎么回事呢?谢谢

  回复  引用    

#8楼  2006-10-30 13:51 saaa [未注册用户]
我按照文中所述的方法操作, 在最后一步导出前运行Launch the product看到的效果还是我预期的, 可是导出之后再运行EXE文件, 就只有一个空框架, 而没有我所需要添加的插件, 请问这是怎么回事儿? 3Q!!
  回复  引用    

#9楼  2006-11-27 14:22 leaderbird [未注册用户]
各位大哥帮帮忙吧:小弟是刚开始做RCP程序,今天在按照这个的上 下的操作后运行时出现以下的错误:请大家帮个忙!
MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IProject
at org.eclipse.ui.internal.ide.model.WorkbenchAdapterFactory.<init>(WorkbenchAdapterFactory.java:35)
at org.eclipse.ui.internal.ide.model.WorkbenchAdapterBuilder.registerAdapters(WorkbenchAdapterBuilder.java:33)
at com.augurit.aos.application.AosWorkbenchAdvisor.initialize(AosWorkbenchAdvisor.java:16)
at org.eclipse.ui.application.WorkbenchAdvisor.internalBasicInitialize(WorkbenchAdvisor.java:172)
at org.eclipse.ui.internal.Workbench.init(Workbench.java:1002)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1636)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:367)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143)
at com.augurit.aos.application.AosApplication.run(AosApplication.java:13)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:226)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)
  回复  引用    

#10楼 [楼主] 2006-11-28 20:15 八进制      
应该是导出时没有包含org.eclipse.core.resources,IProject接口是在这个plugin里定义的。
saaa的问题也类似,检查导出设置,和每个项目的build文件。
  回复  引用  查看    

#11楼  2007-03-01 20:46 石晓丹 [未注册用户]
如何做到让我的rcp应用程序也能支持动态加载其他的插件?
  回复  引用    

#12楼  2007-03-09 21:29 Eric [未注册用户]
java.lang.RuntimeException: 找不到应用程序标识
麻烦您问一下
这是什么意思
我解决不了了
  回复  引用    

#13楼  2008-04-25 21:27 刘晶晶 [未注册用户]
你好,八进制
我是刚接触RCP 现在想做一个应用系统,但又想把功能一插件的方式来实现,请问如何把一个个自己做的插件以JAR包的方式加载到我的RCP中来呢,能否实现像eclipse 中安装插件那样拷贝到plugin文件夹下呢?希望得到你的答复,我将继续密切关注此宝地!多谢了!

  回复  引用    

#14楼 [楼主] 2008-04-26 00:43 八进制      
RCP里也是以插件方式开发的,所以你的应用是可以打包成插件格式的jar包的。
  回复  引用  查看    

#15楼  2008-05-08 14:38 刘晶晶 [未注册用户]
多谢八进制的解答,该问题已经解决了。现在又有几个问题想请教:
1 本人的RCP项目名在开机后出现报错(红叉),但结果都可以运行出来,无任何错误信息显示于控制台。(不知道是否与我前天晚上突然断电有关)
2 我修改程序,在主菜单上加一个新的菜单项,但运行结果始终出不来,也无报错提示(包名上的错误依旧),但导出产品后运行产品则出现正确的结果,即:菜单项出现。请问这是什么原因啊?该如何解决次问题?
3 本人想在view中以ole或 activex方式使用word的 插入->对象。。。功能,即点击view中一个按钮,其响应的事件是弹出word中的一个功能界面(即word的插入->对象。。。点击所出来的界面 ),然后选中某个对象(如一个图片对象)后,让它显示在我的view中的image控件上。不知道此功能能否实现,该如何去做?
多谢指点了!!不甚感激!!
  回复  引用    

#16楼  2008-05-23 17:07 高 [未注册用户]
八进制你好!
我通过product输出RCP后,在发布的目录中有两个文件夹,分别是plugins和configuration以及eclipse.exe.现在我在这发布的目录中另外新建了个文件夹conf用来放置程序的配置的文件.可我怎么告诉RCP来找到这个文件夹呢??如果是通过classpath配置来找的话,这个classpath又在哪里配呢?
期待您的解答.先谢谢了.
  回复  引用    

#17楼 [楼主] 2008-05-23 18:02 八进制      
请参考这篇:
http://www.cnblogs.com/bjzhanghao/archive/2006/07/19/454980.html
  回复  引用  查看    

#18楼  2008-05-25 22:11 高 [未注册用户]
解决了 非常感谢!
  回复  引用    

楼主好人,我今天刚装了个插件,然后就把\configuration文件夹下的东西全删除了,本期望把新装的插件添加进去,谁知,连eclipse都启动不了。然后我又把删掉的东西又全部还原了,但还是不行,还出现如下错误信息,楼主大好人,帮帮忙吧,大恩不言谢!
!ENTRY org.eclipse.osgi 4 0 2008-05-26 10:16:02.515
!MESSAGE Application error
!STACK 1
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:72)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447)
at org.eclipse.equinox.launcher.Main.run(Main.java:1173)
  回复  引用    

#20楼  2008-06-24 14:17 高 [未注册用户]
八进制你好!
在Eclipse中我们可以通过双击EidorPart或ViewPart的页签来最大化此WorkbenchPart,但在我自己的RCP应用中却不知道怎样实现.
我一直没有找到这方面的资料,所以非常期待你的解答.

  回复  引用    

#21楼  2008-06-24 17:10 高 [未注册用户]
已经找到最大化的方法:
IWorkbenchPage page = getActivePage();
if (page != null) {
if (page instanceof WorkbenchPage) {
IWorkbenchPartReference partRef = page.getActivePartReference();

if (partRef != null) {
((WorkbenchPage) page).toggleZoom(partRef);
}
}
}
现在的问题是:当我双击EditorPart(或者ViewPart)标签时,怎样捕获这个双击事件?
  回复  引用    

#22楼  2008-06-30 19:20 fy_kenny      
我有个问题,RCP开发中视图上的工具条上Action上的图片显示正常.

当我导出产品后,就出现了红色的小方块了.

我知道图片路径有问题,但,不知道怎么处理.

请给点 建议啊..

哈哈谢谢了
  回复  引用  查看    

应该是build.properties里没包括这些图片吧
  回复  引用    

#24楼  2008-07-05 21:53 marksman [未注册用户]
八进制你好!
我的rcp项目在eclipse里运行正常,导出后运行报错,如下。是哪里的问题


!SESSION 2008-07-05 17:21:35.625 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.5.0
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CN
Command-line arguments: -os win32 -ws win32 -arch x86

!ENTRY org.eclipse.ui 4 4 2008-07-05 17:21:44.375
!MESSAGE Unhandled event loop exception

!ENTRY org.eclipse.ui 4 0 2008-07-05 17:21:44.375
!MESSAGE 无法解析的编译问题:
不能解析导入 org.jdom
不能解析导入 org.jdom
Document 不能解析为类型
document 不能解析
Document 不能解析为类型
Element 不能解析为类型
Element 不能解析为类型
document 不能解析
document 不能解析
Element 不能解析为类型
Element 不能解析为类型
Element 不能解析为类型
Element 不能解析为类型
Element 不能解析为类型

  回复  引用    

#25楼 [楼主] 2008-07-11 23:17 八进制      
@marksman
build.properties里设置不对,少导出了某些jar文件
  回复  引用  查看    

求救楼主:
eclipse rcp,昨天还可以运行,今天就出现问题了,
错误日志中提示:Application error 和 找不到产品xx.xx.xx.xx.product
有谁知道怎么解决吗?

  回复  引用    

已解决,谢谢,是很弱智的问题,是因为我误删除了一行代码,呵呵
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: