0

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

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

我可以纠正这个问题吗?我可以强制 acceleo 包注册表成为内存注册表吗?我可以在语义级别强制类匹配(而不仅仅是在 Java 上==吗?)

4

2 回答 2

1

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

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

Laurent Goubet Obeo

于 2012-05-29T06:53:32.443 回答
0

要为来到这里的任何人回答这个问题:

真正的问题是我的 EMF 包的 URI。我有一个commonscommons.study包。包的 URIcommons被设置为http://domain.com/model.ecore#/. Acceleo 在运行时添加他自己的(空白)http://domain.com/model.ecore,以防止代理解析器将请求委托给工作区。

解决方案是将我的根commons包重命名为正确http://domain.com/model.ecore的并将commons.studyURI 设置为http://domain.com/model.ecore#//study. 这样,Acceleo 资源集将不包含空白包,并将加载正确地委托给 Workspace 包注册表。

另请注意,需要生成您的根包。如果不是,则它没有正确注册,并且不会出现在 Workspace 包注册表中。所以如果根包只包含一个子包,也可以在里面添加一个 DUMMY 类。

于 2012-06-20T16:36:43.160 回答