1

Hibernate、JPA、および組み込みの Derby を使用して、非常に小さな JPA テスト アプリを組み立てようとしています。Derby から IllegalAccessError を取得しましたが、インターネット上で解決または使用可能な情報を見つけることができませんでした:

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 の「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 は 1 つのバージョンの derby からロードされている可能性がありますが、EmbeddedDriver は以前のバージョンの Derby 用の別の jar からロードされています。

この場合は、古いバージョンの Derby をクラスパスから削除してください。

于 2012-09-15T04:50:51.860 に答える