首先,我是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">
在ATL项目中,一切都按预期工作。
现在我需要使用Acceleo创建M2T转换。所以对于初学者,我创建了两个模块,一个主要的:
[comment encoding = UTF-8 /]
[module PsmToCode('/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore')]
[import org::eclipse::acceleo::psm2code::files::ResourceModelClasses/]
[template public PsmToCode(aRESTfulServicePSM : RESTfulServicePSM)]
[comment @main/]
[for ( aCSharpResourceModel : CSharpResourceModel | aRESTfulServicePSM.hasCSharpRModel)]
[aCSharpResourceModel.generateResourceModelClasses()/]
[/for]
[/template]
另一个:
[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]
当我运行时,我得到Package with uri '/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore' not found. (file:/H:/Users/doumas/workspace/PIM2PSM/WSATPSM.xmi, 6, 15)
例外。我做错了什么?
提前致谢。
答案 0 :(得分:3)
您的元模型可能有.ecore
,但您没有生成元模型代码(使用.genmodel
)。当您尝试使用EMF工具(Acceleo / QVT等)打开.xmi
文件时,会出现错误。所以,这里有很多要点;)。
您可以处理元模型的静态或动态实例。
生成元模型的代码时生成静态实例(使用.genmodel
),将项目注册为插件,并创建符合部署的元模型的模型。在这种情况下,您的元模型被部署为Eclipse插件,并且当Eclipse加载插件时,您的元模型将在全局注册表中注册。在开发模式例程中,定义元模型和开发元素的最简单方法是处理两个 eclipse实例。第一个(我将其称为&#34;原始&#34;实例)是您的元模型项目所在的那个。第二个是通过原始实例的run new eclipse configuration
菜单启动的(我将其称为&#34; new&#34;实例)。所以,这是例程:
.genmodel
file->new->other->Example Model EMF Creation Wizard->your_stuff
向导创建模型现在,您的模型已创建,并且您的元模型已在全局注册表中注册,因此Acceleo文件将很好地编译,您的模型将可由任何符合EMF的应用程序打开/重新编译,无需额外的工作。这种方法很长,但也是最简单的方法。
如果您只想处理一个Eclipse实例,并且生成了元模型代码,那么您也可以执行此操作:
registerPackages
方法中添加:
resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(), SomethingPackage.eINSTANCE);
这将注册您的元模型,并且Acceleo转换应该没有任何问题。但是,如果您将Acceleo项目链接到元模型项目,我不确定是否需要此手动步骤。我认为如果元模型项目在同一个工作区中,Acceleo可以自己处理元模型(但是,如果你可以手动完成)。
在您描述的情况下,您正在处理动态实例。这意味着不生成元模型代码。 ATL可以处理动态实例,这就是为什么你能够生成.xmi
的原因。顺便说一下,您可以通过打开元模型来创建.xmi
,选择您的根EClass并点击right_click->Create dynamic instance...
。
如果要处理此类实例,则必须手动为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
注释,它们将被评估;)。
编辑&gt; 我刚看到你的问题已经解决了,我应该看看。对不起,很长的帖子。
答案 1 :(得分:0)
简而言之,您需要使用.genmodel“生成模型代码”。