【问题标题】:JDO + datanucleus API enhancementJDO + datanucleus API 增强
【发布时间】:2014-12-31 17:31:42
【问题描述】:

我想动态加载不在类路径中的 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());

类路径中包含以下 jar: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:我还注意到方法enhanced返回0,表示该类尚未增强(我们可以排除其他选项)

谢谢

【问题讨论】:

  • 如果某些内容没有得到增强,我相信日志会告诉你。你当时确实看过日志? DataNucleus 也很长时间不需要 asm.jar 和 datanucleus-connectionpool.jar 了
  • 感谢您的提示。我会在星期一检查日志(我添加了 asm “作为预防措施”,删除它会很棒)

标签: jdo datanucleus


【解决方案1】:

我想我找到了解决此问题的简单方法。 在运行时,我创建了一个 jar,其中包含更新后的元数据文件 META-INF/package.jdo。然后我按照here 的描述将此 jar 添加到类路径中 使用这些技巧,我不需要重新增强我的类,因为它在编译后得到了增强。

(但为了获得信息,我不得不调用 JDOEnhancer.addFiles() 来增强我的课程。)

【讨论】:

    【解决方案2】:

    所以您对loadClass 的调用已经加载了未增强的类(因为它可能已经加载以执行增强),而您没有按照http://www.datanucleus.org/documentation/development/dynamic_class_metadata_enhance_runtime.html 提供的教程进行操作

    【讨论】:

    • 感谢您的链接,但最大的问题是增强功能不起作用。正如我已经说过的,方法增强返回 0(增强类的数量)
    • 无论增强是否“有效”,您仍然需要像此链接所示的那样拥有一个单独的 ClassLoader。
    • 因此,据我所知,要正确使用增强类,我必须使用“更新的”类加载器创建 PersistenceManagerFactory 的实例。那么,我需要调用方法 populateMetaData() 两次吗? (首先在调用增强之前,然后持久化数据)?
    • 该链接解释得很清楚。您不能使用默认的类加载器,因为它会加载未增强的类,并且一旦加载就不能 UNLOAD 类。所以你在一个新的类加载器中完成它。
    • 链接不可用
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多