【问题标题】:Derby IllegalAccessError德比非法访问错误
【发布时间】:2012-09-15 04:22:13
【问题描述】:

尝试使用 Hibernate、JPA 和嵌入式 Derby 组装一个非常小的 JPA 测试应用程序。从 Derby 获取 IllegalAccessError,我无法解决或在 Internet 上找到可用信息:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method       org.apache.derby.jdbc.EmbeddedDriver.boot()V from class org.apache.derby.jdbc.AutoloadedDriver    

derby.jar 10.9.1.0 在类路径中。

我已经为我的 Oracle XE 实例成功设置了一个类似的 persistence.xml,它运行良好。

我没有运行任何 derby 网络服务器。我已遵循 derby 安装说明并验证了安装。我使用 derby "ij" 命令行工具创建了我的数据库(名为 "swift")。

我无法理解这个例外,我肯定会欣赏一些新的眼睛。


缩写堆栈跟踪:

INFO: HHH000401: using driver [org.apache.derby.jdbc.EmbeddedDriver] at URL       [jdbc:derby:localhost:1527/swift:create-true]
Sep 14, 2012 11:12:00 PM     org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000046: Connection properties: {user=swift, password=****, autocommit=true, release_mode=auto}
Exception in thread "main" java.lang.IllegalAccessError: tried to access method     org.apache.derby.jdbc.EmbeddedDriver.boot()V from class org.apache.derby.jdbc.AutoloadedDriver
        at org.apache.derby.jdbc.AutoloadedDriver.getDriverModule(Unknown Source)
        at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)

PERSISTENCE.XML:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns /persistence/persistence_2_0.xsd">

<persistence-unit name="persistenceUnit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.gdeb.swift.NIIN</class>
    <class>com.gdeb.swift.RIC</class>
    <properties>
        <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="hibernate.connection.url" value="jdbc:derby:/swift:create-true" />
            <property name="hibernate.connection.username" value="swift" />
            <property name="hibernate.connection.password" value="swift" />
    </properties>
    </persistence-unit>
</persistence>

【问题讨论】:

    标签: hibernate jpa derby


    【解决方案1】:

    这有点像在黑暗中拍摄,但希望它能为您指明正确的方向。 IllegalAccessError 表示一个类试图调用另一个类中不允许访问的方法(例如私有方法)。显然,在正常情况下,这会在编译时被阻止,但有几种方法可以在运行时出现。具体来说:

    • 如果调用者和被调用者是不同的版本,并且方法在一个版本中是公共的,而在另一个版本中是私有的
    • 如果调用者和被调用者由不同的类加载器加载,并且它是一个包保护方法。在这种情况下,这些包可能被认为是不同的,因为它们是在不同的类加载器中加载的。

    一些快速的谷歌搜索表明,在 derby 中引导方法的可见性发生了变化。特别是在10.0 中它是私有的,而在10.1.2.1 中它是包保护的,并从 AutoloadedDriver 调用。

    基于此,我会说您受到第一个案例的打击。看看你是否能找到不止一个版本的 Derby。 AutoloadedDriver 很可能是从一个版本的 derby 加载的,而 EmbeddedDriver 是从另一个用于早期版本的 Derby 的 jar 加载的。

    如果是这种情况,请从类路径中删除旧版本的 Derby。

    【讨论】:

    • 请注意,Derby 的副本通常与其他 Java 软件包捆绑在一起,例如应用服务器和其他中间件,甚至 JDK 本身,因此很容易将其他版本的 Derby 放入您的在不知不觉中安装。
    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多