我已经写了下面的示例应用程序创建一个EJB
刻板的将其应用到TimeEntry
类:如何在独立应用程序中使用EMF创建和应用UML2立体声类型?
import java.io.File;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Factory;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.uml2.uml.*;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.UMLPackage.Literals;
import org.eclipse.uml2.uml.resource.UMLResource;
public class SampleProfile
{
private static final ResourceSet RESOURCE_SET = new ResourceSetImpl();
public static void main(String[] args) throws Exception
{
Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
UMLResource.FILE_EXTENSION,
UMLResource.Factory.INSTANCE
);
final Model umlMetamodel = (Model) loadPackage(UMLResource.UML_METAMODEL_URI);
final Model sampleModel = UMLFactory.eINSTANCE.createModel();
sampleModel.setName("Sample Model");
final Profile sampleProfile = UMLFactory.eINSTANCE.createProfile();
sampleProfile.setName("Sample Profile");
final Stereotype ejbStereo = sampleProfile.createOwnedStereotype("EJB");
extendMetaclass(umlMetamodel, sampleProfile, "Class", ejbStereo);
sampleProfile.define();
final Package samplePackage = sampleModel.createNestedPackage("sample");
samplePackage.applyProfile(sampleProfile);
final Class sampleClass = samplePackage.createOwnedClass("TimeEntry", false);
sampleClass.applyStereotype(ejbStereo);
final File outputFile = new File("sample_model.uml");
final URI outputUri = URI.createFileURI(outputFile.getAbsolutePath());
final Resource resource = RESOURCE_SET.createResource(outputUri);
resource.getContents().add(sampleModel);
resource.getContents().add(sampleProfile);
resource.save(null);
}
private static Package loadPackage(final String uri)
{
System.out.println("uri = " + uri);
final Resource resource = RESOURCE_SET.getResource(URI.createURI(uri), true);
EcoreUtil.resolveAll(resource);
return (org.eclipse.uml2.uml.Package) EcoreUtil.getObjectByType(resource.getContents(), Literals.PACKAGE);
}
private static void extendMetaclass(final Model umlMetamodel,
final Profile profile,
final String name,
final Stereotype stereotype)
{
stereotype.createExtension(referenceMetaclass(umlMetamodel, profile, name), true);
}
private static org.eclipse.uml2.uml.Class referenceMetaclass(final Model umlMetamodel,
final Profile profile,
final String name)
{
final Class metaclass = (Class) umlMetamodel.getOwnedType(name);
profile.createMetaclassReference(metaclass);
return metaclass;
}
}
但是运行的应用程序,我在控制台中此错误消息:
uri = pathmap://UML_METAMODELS/UML.metamodel.uml
Exception in thread "main" org.eclipse.emf.ecore.resource.impl.ResourceSetImpl$1DiagnosticWrappedException: java.net.MalformedURLException: unknown protocol: pathmap
at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.handleDemandLoadException(ResourceSetImpl.java:315)
at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274)
at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:397)
任何想法我的代码可能有什么问题,以及如何解决这个问题?该应用程序是一个在Eclipse之外运行的命令行应用程序。
也许您可以尝试在无头Equinox运行时内将您的命令行应用程序作为OSGi包运行。通过这种方式,您将获得像这里提到的plugin.xml贡献的所有优点,并仍然在Eclipse UI之外运行。 – 2010-12-07 10:25:16