Eclipse 使用自定义ecore元模型的Acceleo转换

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

首先,我不熟悉eclipse的建模功能,所以这个问题可能很简单,但我已经搜索了好几天,还没有找到答案

我已经用ecore建模项目创建了一个ecore元模型文件。URI如下:
/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
  • 生成元模型代码
  • 您可以从原始eclipse实例启动“新”eclipse实例
  • 您可以通过
    文件->新建->其他->示例模型EMF创建向导->您的东西-/code>向导来创建您的模型
  • 现在,您的模型已创建,元模型已在全局注册表中注册,因此Acceleo文件将编译良好,您的模型将可由任何符合EMF的应用程序打开/读取,而无需额外工作。这个方法很长,但也是最简单的

    如果您只想处理一个Eclipse实例,并且生成了元模型代码,则还可以执行以下操作:

  • 将acceleo项目链接到元模型项目
  • 修改Acceleo生成的java文件,并将其添加到
    registerPackages
    方法中:
    resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(),SomethingPackage.eINSTANCE)
  • 这将注册您的元模型,并且Acceleo转换应该不会出现任何问题。但是,如果将Acceleo项目链接到元模型项目,我不确定是否需要此手动步骤。我认为,如果元模型项目位于同一工作区中,Acceleo可以自己处理元模型(但在这种情况下,您可以手动处理)

    动态实例 在您描述的案例中,您正在处理动态实例。这意味着不会生成元模型代码。ATL可以处理动态实例,这就是为什么您能够生成
    .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);