Исключение «Требуется зарегистрированный завод» при загрузке ресурса - PullRequest
4 голосов
/ 04 июля 2011

Я получаю следующее исключение:

 java.lang.RuntimeException: Cannot create a resource for 'file:/home/my_conf.xml'; a registered resource factory is needed

Код "взрыва" подобен этому и останавливается на: resource = resourceSet.....

    ResourceSet resourceSet = new ResourceSetImpl();
    Resource resource = null;

    File f = new File(filename); 
    URI uri = URI.createFileURI(f.getAbsolutePath());

    if (!f.exists()) {
        throw new Exception(filename + " does not exist");

    } else {
        resource = resourceSet.getResource(uri, true);
        mapPrepConfiguration = (MapPrepConfiguration) resource.getContents().get(0);
    }

У кого-нибудь есть подсказка?

1 Ответ

7 голосов
/ 04 июля 2011

Если вы работаете в автономном режиме, вам придется вручную зарегистрировать фабрики в реестре фабрики вашего набора ресурсов.
Добавьте следующую строку после создания вашего экземпляра набора ресурсов:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml", new XMLResourceFactoryImpl());

См. http://wiki.eclipse.org/EMF-FAQ#How_do_I_use_EMF_in_standalone_applications_.28such_as_an_ordinary_main.29.3F

Для проблемы с Пакетом не найден, есть две возможности в зависимости от вашего случая:

  • Если вы используете статическую метамодель (реализация Java создается извашей модели ecore), вам нужно только получить доступ к соответствующему экземпляру пакета, чтобы он был загружен и зарегистрирован в глобальном реестре пакетов EMF.

YourPackage packageInstance = YourPackage.eInstance;

  • Если вы используете динамическую метамодель (не сгенерирован Java-код), вам нужно зарегистрировать ее вручную.
resourceSet.getPackageRegistry().put(yourPackage.getNsURI(), yourPackage);

В предыдущем коде у вас будетчтобы предварительно получить пакет EPackage из вашей модели ecore программным способом.

...