Я хочу, чтобы сравнить две модели, которые соответствуют к данной Ecore метамодели, как это:EMF Сравнить две модель
public void compare() {
URI uri1 = URI.createFileURI("file1.xmi");
URI uri2 = URI.createFileURI("file2.xmi");
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
ResourceSet resourceSet1 = new ResourceSetImpl();
ResourceSet resourceSet2 = new ResourceSetImpl();
resourceSet1.getResource(uri1, true);
resourceSet2.getResource(uri2, true);
IComparisonScope scope = new DefaultComparisonScope(resourceSet1, resourceSet2, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
List<Diff> differences = comparison.getDifferences();
// Let's merge every single diff
IMerger.Registry mergerRegistry = new IMerger.RegistryImpl();
IBatchMerger merger = new BatchMerger(mergerRegistry);
merger.copyAllLeftToRight(differences, new BasicMonitor());
}
Если я запускаю этот код, я получаю ошибку Package with uri '/uri/of/the/package' not found
, которая является URI метамодели. Я попытался зарегистрировать модель ecore, щелкнув правой кнопкой мыши, а затем Register EPackages
, но это не сработало. Что я делаю неправильно? «Как я могу зарегистрировать пакет (я предпочитаю статически, но динамически также работать).
Нет, это не называется 'xmi'. Я просто использовал его для примера. Назовем это '.xmj'. Нет никакого сгенерированного кода модели, только ecore и genmodel. – landunder
Вам нужен сгенерированный EPackage и EFactory, иначе emf не знает, как разбирать ваш xmi-файл. Тем не менее, можно загрузить файл * .ecore без какого-либо кода модели, потому что EcorePackage уже существует. Поэтому просто сгенерируйте код модели и правильно зарегистрируйте пакет. –