有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用Java加载纸草uml模型?

我用纸莎草创建了一个类图,得到了一个*。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加载papyrus uml模型


共 (1) 个答案

  1. # 1 楼答案

    你已经拥有了几乎所有的东西,它只遗漏了很少的细节,还有一些线条需要删除

    但首先,.uml文件与纸莎草没有直接关系。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中的包Registry是分层的:如果它找不到链接到元模型URI的元模型包实例,它会尝试在全局EPackage.Registry中找到它。因此,要么在全局注册表中注册绑定(URI string, EPackage instance),要么在ResourceSet实例中注册绑定。两者都不是必需的

    此外,在您的情况下也不需要xmi工厂注册

    最后,使用来自ResourcetSetgetResource加载资源几乎是好的,下面是修改后的版本:

    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.
    

    另外,尽量使用UMLUtilUML2UtilEcoreUtil静态类,它提供了很多查找/复制/筛选的工具。。。元素

    以下是我使用的最后一个片段:

    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修复了异常抛出。为了清除不必要的代码,答案的其余部分仍然有效