我使用纸莎草创建了一个类图,我得到了一个* .uml模型.现在我想通过编写一些Java代码来遍历* .uml元素.
我试过这段代码:
URI uri = URI.createURI("*.uml");
ResourceSet set = new ResourceSetImpl();
set.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
set.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap()
.put("uml", UMLResource.Factory.INSTANCE);
set.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put("xmi", new XMIResourceFactoryImpl());
//set.createResource(uri);
Resource res = set.getResource(URI.createURI(new URL("*.uml").toString(),true),true);
但我得到了例外:
Exception in thread “main” java.lang.NoSuchMethodError:
org.eclipse.emf.ecore.resource.URIConverter.createInputStream(
Lorg/eclipse/emf/common/util/URI;Ljava/util/Map;)Ljava/io/InputStream;
如何使用Java加载纸莎草uml模型?
解决方法:
你几乎拥有所有东西,它只缺少一些细节,并且有一些线要删除.
但首先,.uml文件与Papyrus没有直接关系. Papyrus能够生成.uml文件,但它们不仅仅是Papyrus文件.此文件扩展名由UML插件管理,该插件提供UML元模型(在Ecore中定义),它的实现和处理这些文件的不同工具.
如果我们拿你的代码:
ResourceSet set = new ResourceSetImpl();
set.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
set.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap()
.put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
这部分应足以将UML元模型及其工厂注册到ResourceSet.
这一行:
EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
只要您使用set加载模型,就不需要. ResourceSetImpl中包含的包注册表是层次结构:如果它找不到链接到元模型URI的元模型包实例,它会尝试在全局EPackage.Registry中找到它.因此,您可以在全局注册表中注册绑定(URI字符串,EPackage实例),也可以在ResourceSet实例中注册绑定.两者都不是必需的.
此外,在您的情况下,xmi工厂注册也不是必需的.
最后,使用ResourcetSet中的getResource加载资源几乎是好的,这是修改后的版本:
Resource res = set.getResource(URI.createFileURI("/path/to/my_model.uml"), true);
此片段创建一个URI,指向磁盘上的文件并加载它.然后,您可以使用getContents()方法从资源中访问元素.
res.getContents().get(0); // For example to get the root of your model.
另外,尝试尽可能多地使用UMLUtil,UML2Util和EcoreUtil静态类,它提供了很多工具来查找/复制/过滤…元素
这是我使用的最终片段:
ResourceSet set = new ResourceSetImpl();
set.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
set.getResourceFactoryRegistry().getExtensionToFactoryMap()
.put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap()
.put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
Resource res = set.getResource(URI.createFileURI("/path/to/my_model.uml"), true);
编辑>问题的大部分是使用的EMF版本.从EMF 2.3到> 2.4修复了异常抛出.其余的答案仍然有效,以清理不必要的代码.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。