我想用Acceleo生成一些代码。我正在构建我的模型实体在内存中,我想为它生成代码。如何在内存模型上生成加速代码?
现在,当Acceleo尝试将我的模型对象与我的模板函数的参数类型相匹配时,它不匹配。这些类完全相同,但由于Acceleo的包注册表和我的内存模型不同,它们不匹配,Acceleo表示没有匹配的模型元素可以找到主模板。
我能纠正这个问题吗?我可以强制加速套件注册表成为内存注册表吗?我可以强制类匹配在语义层面(而不是仅仅基于Java ==
?)
我想用Acceleo生成一些代码。我正在构建我的模型实体在内存中,我想为它生成代码。如何在内存模型上生成加速代码?
现在,当Acceleo尝试将我的模型对象与我的模板函数的参数类型相匹配时,它不匹配。这些类完全相同,但由于Acceleo的包注册表和我的内存模型不同,它们不匹配,Acceleo表示没有匹配的模型元素可以找到主模板。
我能纠正这个问题吗?我可以强制加速套件注册表成为内存注册表吗?我可以强制类匹配在语义层面(而不是仅仅基于Java ==
?)
为了回答这个问题的人谁沿着这里来:
真正的问题是我的EMF包的URI。我有一个commons
和commons.study
包。 commons
包的URI被设置为http://domain.com/model.ecore#/
。 Acceleo在运行时添加了自己的(空白)http://domain.com/model.ecore
,这会阻止代理解析器将请求委派给工作区。
解决方案是将我的根commons
包重命名为合适的http://domain.com/model.ecore
,并将commons.study
URI设置为http://domain.com/model.ecore#//study
。这样,Acceleo资源集将不会包含空白包,并将加载正确委派给Workspace包注册表。
请注意,您的根包需要生成。如果没有,则它没有正确注册并且不会出现在Workspace包注册表中。因此,如果根包只包含一个子包,那么也要在其中添加一个DUMMY类。
,如果它不能在全局注册表中找到Acceleo只注册在自己的注册表车型。你确定你使用正确的NsURI来注册包吗?您在Acceleo模块([module myModule('<NsURI>')]
)开头设置的URI必须与您的元模型根包的NsURI相匹配。它还必须与您在主模块旁边生成的java类的registerPackages
方法中定义的内容相匹配(请注意,因为您正在内存中创建模型,所以最后一步可能不是必需的)。
如果这三者匹配,Acceleo应该能够将模型的元素与生成模块中定义的类型相匹配。如果这还不够,我们需要知道在创建内存模型之前如何注册包?
洛朗Goubet Obeo
用于注册软件包的nsURI是'http:// mypackage.com/1.0 /'。 Acceleo使用的类的容器是一个'EPackageImpl',而我传递的模型类的容器是'MyOwnPackageImpl'。这表明Acceleo未使用与我的运行时实例相同的软件包注册表。 – parasietje
啊哈,当我使用XMI编译模式时,Acceleo只获得一个代理! – parasietje
Acceleo使用的代理URI是'file:/// path/to/file.emtl#// mypackage/Object',而不是'http://mypackage.com/1.0/#/mypackage/Object'。我的模块在MTL文件中正确定义为'[module generateRCode('http://mypackage.com/1.0/')]'。 – parasietje