2012-02-21 49 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());