【问题标题】:ActiveJDBC Instrumentation: Unable to instrument the model classes which are in JarActiveJDBC Instrumentation:无法检测 Jar 中的模型类
【发布时间】:2014-12-08 18:20:15
【问题描述】:

我使用的是activejdbc 1.4.9。我创建了一个 jar(使用 maven),它有两个 ActiveJDBC 模型类。我将 jar 添加到应用程序中。应用程序还有三个模型类。当我编译并尝试运行应用程序(基于 gradle)时,activejdbc 仅检测应用程序中的 3 个类,但不检测 jar 中的类。当我尝试将数据写入 jar 中的两个模型时,它会抛出异常

org.javalite.activejdbc.DBException:无法从数据库中检索元数据。你确定表存在于数据库中吗?

现在我有一些疑问。请帮助我解决和理解一些事情。

  1. 检测是如何发生的?
  2. 当我们创建一个 jar 时,它会包含检测类吗?
  3. 为什么会抛出这个错误?

【问题讨论】:

    标签: gradle build.gradle activejdbc


    【解决方案1】:

    如果类没有被检测,它会抛出这个错误。这意味着在将模型类放入 jar 文件之前,您需要对它们进行检测。不过,您使用哪种构建方法并不重要。这个http://javalite.io/instrumentation 解释了什么是仪器以及如何去做。 Instrumentation 不会创建 jar,它只是将一些字节码添加到您的类中。在您需要的所有场景中:

    1. 写代码:)
    2. 编译
    3. 仪器

    在此之后,您可以执行以下任何操作:

    • 使用文件系统中的类文件运行应用程序
    • 将类文件打包成 jar 文件并在类路径中使用它
    • 将 jar 文件打包成更大的应用程序(WAR、EAR、RAR 等)并部署您的应用程序

    有意义吗?

    【讨论】:

    • 它没有用。我遵循的步骤是 1. mvn compile 2. mvn activejdbc-instrumentation:instrument 3. mvn package。然后我将此罐子添加到应用程序中。仍然抛出异常 org.javalite.activejdbc.DBException: failed to find metamodel for class X. 你确定 DB 中存在对应的表吗?
    • 我确信您的构建有问题,并且您在检测后重新编译类(在那里通过擦除它)。这里是Simple Maven Example,这里是Simple Gradle Exmple,哪一个都可以帮助你
    • 感谢 ipolevoy 的回复。构建脚本与您在示例中指定的完全相同。它创建了 jar,并将一些静态方法添加到模型类(经过验证的反编译器)。将这个jar添加到应用程序后,它仍然在抛出应用程序。
    • ipolevoy,如果我正在运行 intellij,它工作正常。如果我构建 shadow jar 并运行它,它不工作
    • @SanthoshTangudu,你的构建显然有问题。您在应用程序中运行非仪器类。如果你没有运行 java 8,你可以试试Dynamic Instrumentation。这样,您可以跳过静态检测。否则,您需要找出为什么在类路径中包含非仪器模型
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多