我希望动态加载不在类路径中的XML元数据文件(XML元数据文件将在启动我的应用程序后生成)。我想我可以调用这个方法
MetaDataManager.registerFile(java.lang.String fileURLString, FileMetaData filemd, ClassLoaderResolver clr)然后,我尝试了API增强,所以我添加了以下几行:
JDOEnhancer enhancer = JDOHelper.getEnhancer();
enhancer.setVerbose(true);
enhancer.addClasses(ClassToPersist.class.getName()).enhance();
getClass().getClassLoader().loadClass(ClassToPersist.class.getName());类路径中包含以下jars : datanucleus-api-jdo.jar、datanucleus-connectionpool.jar、datanucleus-core.jar、datanucleus-rdbms.jar、jdo-api.jar、asm.jar。但是当我启动我的应用程序时,我得到了这样的异常:
Caused by: mypackage.MyException:
org.datanucleus.api.jdo.exceptions.ClassNotPersistenceCapableException: The class "mypackage.ClassToPersist" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.你知道怎么解决这个问题吗?PS:我还注意到方法enhance返回0,这表示类没有得到增强(我们可以排除其他选项)
谢谢
发布于 2015-01-01 02:33:33
因此,您对loadClass的调用已经加载了未增强的类(因为它可能是为了执行增强而加载的),并且您没有遵循http://www.datanucleus.org/documentation/development/dynamic_class_metadata_enhance_runtime.html提供的教程
发布于 2015-01-11 07:49:02
我想我找到了一个简单的方法来解决这个问题。在运行时,我创建了一个jar,其中包含更新的元数据文件META-INF/package.jdo。然后我将这个jar添加到类路径中,就像使用这个hacks所描述的here一样,我不需要重新增强我的类,因为它在编译后得到了增强。
(但作为参考,我必须调用JDOEnhancer.addFiles()来增强我的类。)
https://stackoverflow.com/questions/27724363
复制相似问题