执行Acceleo转换遇PackageNotFoundException错误,求解决方案
解决Acceleo转换时的PackageNotFoundException错误
你在执行Acceleo转换时碰到的这个错误,本质是EMF在加载你的dummy.xmi模型时,找不到http://www.eclipse.org/mmt/qvtd/UmlToRdbms#rdbmsMM这个URI对应的Ecore元模型包。先把你遇到的错误日志贴出来方便参考:
Exception in thread "main" org.eclipse.emf.ecore.resource.impl.ResourceSetImpl$1DiagnosticWrappedException: org.eclipse.emf.ecore.xmi.PackageNotFoundException: Package with uri 'http://www.eclipse.org/mmt/qvtd/UmlToRdbms#rdbmsMM' not found. (file:/D:/Utenti/davi9/mde-workspace/Assignment2/Models/dummy.xmi, 7, 108) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.handleDemandLoadException(ResourceSetImpl.java:319) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:278) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:406) at org.eclipse.acceleo.common.utils.ModelUtils.load(ModelUtils.java:391) at org.eclipse.acceleo.common.utils.ModelUtils.load(ModelUtils.java:356) at org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator.initialize(AbstractAcceleoGenerator.java:488) at org.eclipse.acceleo.module.sample.common.Generate.<init>(Generate.java:90) at org.eclipse.acceleo.module.sample.common.Generate.main(Generate.java:144) Caused by: org.eclipse.emf.ecore.xmi.PackageNotFoundException: Package with uri 'http://www.eclipse.org/mmt/qvtd/UmlToRdbms#rdbmsMM' not found. (file:/D:/Utenti/davi9/mde-workspace/Assignment2/Models/dummy.xmi, 7, 108)
咱们一步步来解决这个问题:
1. 确认元模型已存在于项目依赖中
首先得确保你的工作区或者项目里有UmlToRdbms对应的RDBMS元模型:
- 如果是Eclipse工作区,检查是否导入了包含RDBMS元模型的项目(比如带有
.ecore文件的元模型项目,或者已经生成Java代码的元模型实现项目)。如果没有,你需要把这个元模型项目导入进来,或者从对应的插件库中获取。 - 要是用Maven/Gradle构建项目,记得把包含该元模型的依赖jar包添加到你的构建脚本里,比如
org.eclipse.mmt.qvtd.uml2rdbms相关的依赖。
2. 在Acceleo生成器中手动注册元模型包
EMF需要明确知道元模型包的位置,所以咱们得在Acceleo的生成类里手动注册这个包:
- 打开你的
Generate.java类,找到初始化ResourceSet的代码段(一般在构造函数或者initialize方法里)。 - 添加类似下面的代码,把RDBMS元模型包注册到ResourceSet中:
// 获取当前生成器使用的ResourceSet ResourceSet resourceSet = getResourceSet(); // 初始化并注册RDBMS元模型包 RDBMSPackage.eINSTANCE.eClass(); // 触发元模型包的初始化 resourceSet.getPackageRegistry().put(RDBMSPackage.eNS_URI, RDBMSPackage.eINSTANCE);
注意:这里的RDBMSPackage是元模型生成的Java类,要是你的元模型类名不同,记得替换成对应的类,而且要保证eNS_URI的值和错误里的URI完全一致。
3. 检查模型文件的URI引用是否正确
打开你的dummy.xmi文件,定位到第7行附近,检查里面的URI引用是不是和元模型定义的完全一致。有时候模型文件里的URI可能拼写错误,或者和元模型的NS_URI不匹配,这也会导致找不到包的问题。
4. 配置Eclipse运行依赖(如果是在IDE中运行)
要是你是在Eclipse里直接运行Acceleo生成器,记得在运行配置的「Dependencies」标签页里,添加包含RDBMS元模型的项目或者jar包。这样Acceleo在运行时才能加载到对应的元模型。
内容的提问来源于stack exchange,提问作者Davide
相关产品推荐
相关产品推荐

