2012-02-21 52 views

回答

16

如果您已通过您的元模型生成的代码:

resourceSet.getPackageRegistry() 
    .put(org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE.getNsURI() 
    , org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE); 

(这里的 “的genmodel” 元模型)

如果你只有.ecore文件:

// register globally the Ecore Resource Factory to the ".ecore" extension 
// weird that we need to do this, but well... 
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
    "ecore", new EcoreResourceFactoryImpl()); 

ResourceSet rs = new ResourceSetImpl(); 
// enable extended metadata 
final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(rs.getPackageRegistry()); 
rs.getLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, 
    extendedMetaData); 

Resource r = rs.getResource(uriOfYourModel, true); 
EObject eObject = r.getContents().get(0); 
if (eObject instanceof EPackage) { 
    EPackage p = (EPackage)eObject; 
    rs.getPackageRegistry().put(p.getNsURI(), p); 
} 

您可以使用名为registerEcorePackages()的方法找到更多关于此代码here的信息,u sed在我们的定制软件包注册表中注册工作空间中的.ecore文件(使用其工作空间的完整路径)。如果您想在EMF全局包注册表中注册您的元模型,请用EPackage.Registry.INSTANCE替换resourceSet.getPackageRegistry()

+1

非常感谢您的回答Stephane :) – capint 2012-02-22 12:21:04

+0

SUPERB ANSWER !!!!!!非常感谢Stephane!不能感谢你足够的.....“ecore文件”技术是我正在寻找的! – 2012-06-14 19:38:32

+0

嗨,真棒谢谢你!我不得不稍微修改一下代码以使其工作。详情请看我的答案。 – Andrei 2015-04-30 13:34:25

1

我不得不@sbegaudeau修改代码一点,它的工作:

更换

rs.getPackageRegistry().put(p.getNsURI(), p);

EPackage.Registry.INSTANCE.put(p.getNsURI(), p);

而且,不知为什么我不能注册.ecore类型。必须使用“*”:Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());