如何在内存模型中生成Acceleo代码?

时间:2012-05-28 23:36:51

标签: java eclipse acceleo ocl

我正在尝试使用Acceleo生成一些代码。我在内存中构建我的模型实体,我想为它生成代码。

现在,当Acceleo尝试将我的模型对象与模板函数的参数类型匹配时,它不匹配。这些类完全相同,但由于Acceleo的包注册表和我的内存模型不同,它们不匹配,Acceleo说没有找到主模板的匹配模型元素。

我可以更正此问题吗?我可以强制加速包注册表成为内存中的注册表吗?我可以在语义级别强制进行类匹配(而不仅仅是在Java ==上?)

2 个答案:

答案 0 :(得分:1)

如果在全局注册表中找不到模型,则Acceleo仅在其自己的注册表中注册模型。您确定使用正确的NsURI注册包吗?您在Acceleo模块([module myModule('<NsURI>')])开头设置的URI必须与元模型根包的NsURI匹配。它还必须与您在主模块旁边生成的java类的registerPackages方法中定义的内容相匹配(请注意,由于您在内存中创建模型,因此最后一步可能不是必需的。)

如果这三个匹配,Acceleo应该能够将模型的元素与生成模块中定义的类型相匹配。但是,如果还不够,我们需要知道在创建内存模型之前如何注册包?

Laurent Goubet Obeo

答案 1 :(得分:0)

为在场的任何人回答这个问题:

真正的问题是我的EMF包的URI。我有一个commonscommons.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类。