Вероятно, у вас есть .ecore
для вашей метамодели, и вы не сгенерировали код метамодели (используя .genmodel
). У вас возникает ошибка, когда вы пытаетесь открыть файл .xmi
с помощью инструмента EMF (Acceleo/QVT... и т. д.). Итак, здесь много моментов ;).
Вы можете иметь дело со статическими или динамическими экземплярами вашей метамодели.
Статические экземпляры
Статические экземпляры создаются, когда вы генерируете код вашей метамодели (используя .genmodel
), вы регистрируете свой проект как плагин и создаете модель, которая соответствует развернутой вами метамодели. В этом случае ваша метамодель развертывается как подключаемый модуль Eclipse, и ваша метамодель регистрируется в глобальном реестре при загрузке подключаемого модуля Eclipse. В вашей подпрограмме режима разработки самый простой способ определить вашу метамодель и разработать материалы вокруг нее — это обработать два экземпляра eclipse. Первый (я буду называть его исходным экземпляром) — это тот, в котором находится ваш проект метамодели. Второй запускается через меню run new eclipse configuration
из исходного экземпляра (буду называть его новым экземпляром). Итак, вот рутина:
- Вы создаете свою метамодель
- Вы создаете
.genmodel
, связанный с вашей метамоделью
- Вы генерируете код метамодели
- Вы запускаете новый экземпляр eclipse из исходного.
- Вы проходите через мастер
file->new->other->Example Model EMF Creation Wizard->your_stuff
, чтобы создать свою модель
Теперь ваша модель создана, и ваша метамодель зарегистрирована в глобальном реестре, поэтому файл Acceleo будет хорошо скомпилирован, и ваша модель будет открыта/читаема любым приложением, совместимым с EMF, без дополнительной работы. Этот метод долгий, но и самый простой.
Если вы хотите иметь дело только с одним экземпляром Eclipse и если у вас есть сгенерированный код метамодели, вы также можете выполнить это:
- Свяжите свой проект Acceleo с проектом метамодели
- Измените файл Java, сгенерированный Acceleo, и добавьте его в метод
registerPackages
: resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(), SomethingPackage.eINSTANCE);
Это зарегистрирует вашу метамодель, и преобразование Acceleo должно работать без проблем. Однако я не уверен, что этот ручной шаг требуется, если вы связываете свой проект Acceleo с проектом метамодели. Я думаю, что Acceleo может сам справиться с метамоделью, если проект метамодели находится в той же рабочей области (но на всякий случай можно сделать это вручную).
Динамические экземпляры
В описанном вами случае вы имеете дело с динамическими экземплярами. Это означает, что код метамодели не генерируется. ATL может обрабатывать динамические экземпляры, поэтому вы смогли сгенерировать файл .xmi
. Кстати, вы можете создать .xmi
, открыв свою метамодель, выбрав свой корневой EClass и нажав на right_click->Create dynamic instance...
.
Если вы хотите иметь дело с экземплярами этого типа, вам необходимо вручную зарегистрировать свою метамодель для Acceleo. Для этого вам нужно изменить java-файл, сгенерированный Acceleo, и добавить его в метод registerPackages:
File file = new File("path/to/your/metamodel.ecore");
EObject obj = ModelUtils.load(file, resourceSet);
resourceSet.getPackageRegistry().put("metamodel_ns_uri", obj);
(ModelUtils
происходит от org.eclipse.acceleo.common.utils
) Используя это, вы сможете генерировать код из Acceleo с динамическим экземпляром.
Кроме того, несколько слов об Acceleo: если ваши экземпляры RESTfulServicePSM
не будут генерировать код, вы можете напрямую поместить аннотацию @main
в свой шаблон generateResourceModelClasses
. Механизм Acceleo будет выполнять итерацию для каждого экземпляра CSharpResourceModel
самостоятельно. О, и вы можете поместить много @main
аннотаций на многие шаблоны, они будут оценены ;).
РЕДАКТИРОВАТЬ › Я только что видел, что ваша проблема исправлена, я должен был посмотреть. Простите за длинный пост.
person
Vincent Aranega
schedule
20.05.2015
.ecore
или хотели использовать динамические экземпляры в качестве моделей? Кроме того, URI, который вы используете, — это значение атрибутаnsURI
, которое вы установили в корень вашей метамодели? - person Vincent Aranega   schedule 20.05.2015.ecore
для вашей метамодели, и вы не создали код метамодели. Я публикую ответ для разработки;) - person Vincent Aranega   schedule 20.05.2015