开发者社区> 青夜之衫> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

脱离Eclipse环境使用EMF

简介: 一旦熟练使用EMF后,有新项目我总是习惯于先使用工具构造出数据模型,然后让EMF帮我生成java代码。当模型需要修改时,也是用工具修改模型本身,然后让EMF把改动更新到java代码,从而保证模型与代码的同步。
+关注继续查看

一旦熟练使用EMF后,有新项目我总是习惯于先使用工具构造出数据模型,然后让EMF帮我生成java代码。当模型需要修改时,也是用工具修改模型本身,然后让EMF把改动更新到java代码,从而保证模型与代码的同步。最近的一个基于struts的Web项目里我试验了脱离Eclipse运行环境使用EMF,发现比想象中的要更容易,以下是一些经验总结。

1. EMF可以脱离Eclipse环境使用,所以不论你要做的项目是纯swt应用程序、swing应用程序、基于web的应用程序甚至没有GUI的应用程序,这些非Eclipse插件的项目也都可以利用EMF生成的模型代码。不过EMF生成的.edit和.editor部分就难以利用了,因为.edit主要为jface的各种viewer提供支持,.editor则是基于Eclipse的一个编辑器。

2. 要脱离Eclipse独立使用EMF生成的代码,需要在项目里包含EMF的运行库,可以在EMF下载页面找到这个名为Standalone的下载项,下载以后要让里面的.jar文件都包含在项目classpath里。

3. 除添加这些库文件以外,还有少量初始化工作需要在你的应用程序启动时执行。在EMF-FAQ页面专门介绍了初始化的方法,基本上要做的就是在程序启动时执行下面两条命令:

XXXPackage xxxPackage = XXXPackage.eINSTANCE;
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xxx", new XMIResourceFactoryImpl());

Update(2009-2-19): 如果模型文件包含了除emf以外的名称空间声明(例如要打开一个.emx文件),则需要对它们进行注册,下面的代码注册了gmf1.0的名称空间:

((Delegator)EPackage.Registry.INSTANCE).put("http://www.eclipse.org/gmf/runtime/1.0.0/notation", NotationPackage.eINSTANCE); 

4. 用EMF生成模型代码的步骤和平时基本没有区别,仍然是".ecore->.genmodel->java代码"。一般来说,直接在这个EMF项目里以EMF生成的java代码为基础继续开发就可以了,如果你用其他IDE则可以把这些java代码复制过去使用,只是注意一下每次修改ecore后要重复这个生成和复制代码的过程。

5. 关于多个模型和跨模型引用的处理。EMF的一个好处是可以把整个项目的模型保存为多个文件,并且允许文件之间的相互依赖。例如一个在线商店系统里,在设计的时候可以把模型分为用户信息、商品信息和订单信息三大部分,显然订单信息依赖用户和商品信息,所以对用户和商品的管理可以独立进行开发,一方面提高了模块化程度,也增加了重用的可能性,例如在另外一个项目里可以只做很小的修改甚至不做修改的重用用户管理部分或是商品管理部分。

EMF是通过ResourceSet处理多个模型之间的引用的,以上面的在线商店为例,当从一个文件(一般是xmi格式)里载入一个订单实例时,EMF并不会去实际读取存储用户或商品信息的文件,而是使用代理(Proxy)的方式生成一个替代品,当程序里需要得到订单对应的用户的详细信息时(例如执行了theOrder.getCustomer().getAddress()方法),才会实际读取用户信息文件,并根据订单的用户id找到对应的用户信息。

因此,当你的项目里有多个模型并且存在相互引用的这种情况时,建议维护一个全局的ResourceSet实例,可以在程序启动时创建:

ResourceSet resourceSet = new ResourceSetImpl();

对于普通应用程序,可以用单例模式(Singleton)维护ResourceSet实例;若在web应用程序里,也可以利用application维护它。在程序里,每载入一个模型都要把它加到这个ResourceSet实例上。具体方法如下:

//get global ResourceSet instance
ResourceSet resourceSet = ;
//file to load
String filename = ;//e.g. "c:\\work\\test.xxx"
URI fileURI = URI.createFileURI(filename);
//create resource
XMIResource resource = (XMIResource)resourceSet.createResource(fileURI);
//load from file
resource.load(null);
//add resource to global ResourceSet instance
resourceSet.getResources().add(resource);
//get your model
XXXModel xxxModel = (XXXModel) resource.getContents().get(0); 

6. 其他常用方法,以下仍以在线商店里的模型(见此帖)为例:

创建一个新产品(Product),通过ShopFacotory的createProduct()方法而不要直接new ProductImpl():

Product p = ShopFactory.eINSTANCE.createProduct();
//
Product p = (Product)ShopFactory.eINSTANCE.create(ShopPackage.Literals.Product);

把新创建的产品添加到商店(Shop):

Shop model = …;
Product p = …;
model.getProducts().add(p);

通过EMF反射机制得到Product类型的所有属性(非引用类型),任何一个EObject都可以通过这种方式得到其所有属性:

Product p = …;
EClass eclass = p.eClass(); 
for (Iterator iterator = eclass.getEAllAttributes().iterator(); iterator.hasNext();) {
  EAttribute attr = (EAttribute)iterator.next(); //属性,如Product#name
  Object value = p.eGet(attr); //属性值,如“walkman”//do whatever with the value
}

通过EMF反射机制得到Category类型的所有引用,任何一个EObject都可以通过这种方式得到其所有引用:

Category category = …;
EClass eclass = category.eClass();
for (Iterator iterator = eclass.getEAllReferences().iterator(); iterator.hasNext();) {
  EReference ref = (EReference)iterator.next(); //引用,如Category#products
  Object value = category.eGet(ref); //引用值,如EList<Product>(一对多的情况)//do whatever with the value
}

本文转自博客园八进制的博客,原文链接:脱离Eclipse环境使用EMF,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
eclipse集成html5插件
1. 在线安装:Help-&gt;Install New Software...-&gt;Add...-&gt; Name: "Aptana",  Location: http://download.aptana.com/studio3/plugin/install【正确地址】 下载完毕,按步骤一步一步next,最后重启 Eclipse 。 2.给Apt
979 0
Eclipse下快速打开本地文件插件EasyExplorer(转)
EasyExplorer  是一个类似于 Windows Explorer的Eclipse插件,它可以帮助你在不退出Eclipse的环境下浏览本地文件系统,类似的插件也有很多,但是本人喜欢使用这个版本。
747 0
Eclipse安装SVN插件及使用说明
1、下载Eclipse,如果没有安装的请到这里下载安装:http://eclipse.org/downloads/ ,关于Eclipse的下载安装不再赘述。2、下载SVN插件subclipse,安装方法有两种.在线安装和离线插件安装包。
987 0
eclipse SVN插件,subversive
subversive已经纳入eclipse project,以前呼声较高的subclipse没有进去,真有点奇怪,不过subclipse的同步视图实在太难看了,如果一个目录下面有几层,同步的时候把几层空空的目录名都显示出来,相当讨厌.
1076 0
eclipse自带内存监视及回收插件
查了一下,Eclipse 3.2以上都可以直接通过 菜单 Window => Preferences => General => 右边,把 Show Heap Status 打上勾就会在右下角任务栏显示内存监视器,并且可以点击内存回收。
499 0
Eclipse插件引入jar包的方法(转)
搞了两天,终于找到解决办法了。原来  Eclipse 插件项目引入外面的jar包不能用   build path---->add external jars的方法。     先说明两个概念:类加载器,OSGI 类加载器(class loader),顾名思义就是JVM用于加载类的一个工具。
914 0
5.Maven和Eclipse整合(两种方式进行插件的安装),Maven相关设置,Eclipse下创建Maven项目
 1  第一种方式是:在连网的情况下,通过在helpàInstall下安装。 新的地址是:http://download.eclipse.org/technology/m2e/releases 2  第二中方式是: 通过插件配置的方式进行安装插件。 A  将maven所需的插件放到maven的安装目录下,截图如下: B 在Eclips
1308 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载