【问题标题】:How to do Acceleo code generation on in-memory model?如何在内存模型上进行 Acceleo 代码生成?
【发布时间】:2012-06-22 00:03:49
【问题描述】:

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

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

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

【问题讨论】:

  • 注册包的nsURI是http://mypackage.com/1.0/。 Acceleo使用的类的容器是EPackageImpl,而我传递的模型类的容器是MyOwnPackageImpl。这表明 Acceleo 没有使用与我的运行时实例相同的包注册表。
  • 啊哈,当我使用XMI编译模式时,Acceleo只得到一个代理!
  • 而且Acceleo使用的代理URI是file:///path/to/file.emtl#//mypackage/Object而不是http://mypackage.com/1.0/#/mypackage/Object。我的模块在 MTL 文件中正确定义为 [module generateRCode('http://mypackage.com/1.0/')]
  • 好的,我设法赋予了正确的 URI。但是,它仍然无法正确解析(仍然只能获得一个代理)
  • 非常感谢您的帮助 Laurent。我会自己搜索一下,如果我再次陷入搜索困境,我会重新提出一个问题:-)

标签: java eclipse acceleo ocl


【解决方案1】:

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

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

劳伦特·古贝 奥贝奥

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多