德比非法访问错误

Posted

技术标签:

【中文标题】德比非法访问错误【英文标题】: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>

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

请注意,Derby 的副本通常与其他 Java 软件包捆绑在一起,例如应用服务器和其他中间件,甚至 JDK 本身,因此很容易将其他版本的 Derby 放入您的在不知不觉中安装。

以上是关于德比非法访问错误的主要内容,如果未能解决你的问题,请参考以下文章

安全错误。在 php 中使用 ccavenue 检测到非法访问

如何修复 Hadoop 警告:在 Ubuntu 上发生非法反射访问操作错误

使用存储在另一个数组中的数组索引时,Cuda 非法内存访问错误

$cordovaGeolocation.getCurrentPosition 上的“非法访问”

遇到 CUDA 非法内存访问

无法运行 Launch4j(非法访问)