1

尝试使用 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)

持久性.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>
4

1 回答 1

1

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

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

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

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

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

于 2012-09-15T04:50:51.860 回答