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

Java 如何在内存模型上生成Acceleo代码?,java,eclipse,acceleo,ocl,Java,Eclipse,Acceleo,Ocl,我正在尝试使用Acceleo生成一些代码。我正在内存中构建我的模型实体,我想为它生成代码 现在,当Acceleo尝试将我的模型对象与我的模板函数的参数类型匹配时,它不匹配。这些类完全相同,但由于Acceleo和我的内存模型的包注册表不同,它们不匹配,Acceleo说找不到与主模板匹配的模型元素 我能纠正这个问题吗?我可以强制acceleo软件包注册表成为内存注册表吗?我是否可以强制在语义级别(而不是仅在Java上)进行类匹配?如果在全局注册表中找不到模型,Acceleo只能在其自己的注册表中注册

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

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


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

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

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

洛朗古贝
Obeo

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

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

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


还请注意,需要生成根包。如果不是,则它没有正确注册,并且不会出现在工作区包注册表中。因此,如果根包只包含一个子包,那么也可以在其中添加一个伪类。

用于注册包的nsURI是
http://mypackage.com/1.0/
。Acceleo使用的类的容器是
EPackageImpl
,而模型类I pass的容器是
MyOwnPackageImpl
。这表明Acceleo没有使用与我的运行时实例相同的包注册表。啊哈,当我使用XMI编译器模式时,Acceleo只获得一个代理!Acceleo使用的代理URI是
file:///path/to/file.emtl#//mypackage/Object
而不是
http://mypackage.com/1.0/#/mypackage/Object
。我的模块正确定义为
[模块生成器代码('http://mypackage.com/1.0/')]
在MTL文件中。好的,我设法为正确的URI添加了属性。但是,它仍然不能正确解析(仍然只能得到一个代理)非常感谢您的帮助Laurent。我将自己搜索一点,如果我再次陷入搜索,我将重新打开一个问题:-)