Eclipse 使用自定义ecore元模型的Acceleo转换
首先,我不熟悉eclipse的建模功能,所以这个问题可能很简单,但我已经搜索了好几天,还没有找到答案 我已经用ecore建模项目创建了一个ecore元模型文件。URI如下:Eclipse 使用自定义ecore元模型的Acceleo转换,eclipse,eclipse-emf-ecore,metamodel,acceleo,Eclipse,Eclipse Emf Ecore,Metamodel,Acceleo,首先,我不熟悉eclipse的建模功能,所以这个问题可能很简单,但我已经搜索了好几天,还没有找到答案 我已经用ecore建模项目创建了一个ecore元模型文件。URI如下:/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore 我还(通过ATL转换)生成了一个xmi模型文件。第一个元素如下所示: <?xml version="1.0" encoding="ISO-8859-1"?> <RESTfulServicePSM
/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore
我还(通过ATL转换)生成了一个xmi模型文件。第一个元素如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<RESTfulServicePSM
xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"
xmlns="/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore"
name="WSAT">
还有一个:
[comment encoding = UTF-8 /]
[module ResourceModelClasses('/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore')]
[template public generateResourceModelClasses(aCSharpResourceModel : CSharpResourceModel)]
[file (aCSharpResourceModel.parentName.toUpperFirst().concat('.cs'), false, 'UTF-8')]
[/file]
[/template]
当我运行这个程序时,我得到了一个包,其中未找到uri“/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore”。(文件:/H:/Users/doumas/workspace/PIM2PSM/WSATPSM.xmi,6,15)
异常。我做错了什么
提前感谢。您可能拥有元模型的
.ecore
,但您没有生成元模型代码(使用.genmodel
)。当您尝试使用EMF工具(Acceleo/QVT…等)打开.xmi
文件时,会出现错误。这里有很多要点;)
您可以处理元模型的静态或动态实例
静态实例
当您生成元模型的代码(使用.genmodel
),将项目注册为插件,并创建符合已部署元模型的模型时,将生成静态实例。在本例中,元模型作为Eclipse插件部署,并且当Eclipse加载插件时,元模型在全局注册表中注册。在开发模式例程中,定义元模型并围绕元模型开发内容的最简单方法是处理两个eclipse实例。第一个(我称之为“原始”实例)是元模型项目所在的实例。第二个是从原始实例(我称之为“新”实例)通过runneweclipseconfiguration
菜单启动的。因此,这里是常规:
.genmodel
文件->新建->其他->示例模型EMF创建向导->您的东西-/code>向导来创建您的模型
registerPackages
方法中:
resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(),SomethingPackage.eINSTANCE)代码>
.xmi
。顺便说一下,您可以通过打开元模型创建.xmi
,选择根电子课堂并单击右键单击->创建动态实例…
如果要处理此类实例,必须为Acceleo手动注册元模型。为此,您必须修改Acceleo生成的java文件,并将其添加到registerPackages方法中:
File file = new File("path/to/your/metamodel.ecore");
EObject obj = ModelUtils.load(file, resourceSet);
resourceSet.getPackageRegistry().put("metamodel_ns_uri", obj);
(ModelUtils
来自org.eclipse.acceleo.common.utils
)
使用此功能,您可以使用动态实例从Acceleo生成代码
另外,简单介绍一下Acceleo,如果您的RESTfulServicePSM
实例不会生成代码,您可以直接将@main
注释放在generateResourceModelClasses
模板上。Acceleo引擎将自行在每个CSharpResourceModel
实例上迭代。哦,您可以在许多模板上放置许多@main
注释,它们将被评估;)
编辑>
我刚看到你的问题解决了,我应该看看。很抱歉发了这么长的帖子。简而言之,您需要使用.genmodel“生成模型代码”。您是从
.ecore
生成模型代码,还是希望使用动态实例作为模型?此外,您使用的URI是设置为元模型根的nsURI
属性值?@VincentAranega是URI是nsURI属性。你说的模型代码是指.xmi文件吗?这是从ATL转换创建的。也许我需要澄清,我得到的错误来自.xmi文件。如果你不是在谈论xmi,你能详细说明一下吗?好的,我想我明白了,我假设你的问题来自acceleo脚本的执行。您只有元模型的.ecore
,而没有生成元模型代码。我发布了一个要开发的答案;)我只是那样做了。谢谢,正如我所说,我是emf的新手,但是关于“代码生成”的评论对我帮助很大。现在可以了。事实上,我从未使用过.genmodel文件,我认为它会像ATL转换一样简单。无论如何,谢谢你的时间,你帮了我很大的忙。为什么要道歉呢。非常清楚的解释,对我来说非常有用的信息:D
File file = new File("path/to/your/metamodel.ecore");
EObject obj = ModelUtils.load(file, resourceSet);
resourceSet.getPackageRegistry().put("metamodel_ns_uri", obj);