私は Jaybird JDBC ドライバーを開発していますが、今日、Jaybird がコンポーネントの一部をロードする方法と、この場合は NetBeans がクラスロードを制限する方法に関連する問題 ( JDBC-325、休止状態で Jaybird を構成する方法) に遭遇しました。
この問題は、Jaybird がエントリを使用してそれ自体の一部をロードする方法META-INF/services
と、Hibernate ウィザード用に NetBeans によって使用されるクラスローダーがそれらのファイルを明示的に無視することに関連しています (以下の詳細を参照)。
Jaybird 実装の一部であるハードコードされたプラグインのリストを (また) ロードしようとするか、定義を別の場所に移動することで、この問題を回避できます。
META-INF/services
しかし、Jaybird のように内部目的で使用するのは奇妙 (または間違っている) かどうか疑問に思っていましたか?
NetBeans が のロードを除外する理由もわかりませんMETA-INF/services
。Drewのコメントは、 NetBeans がドライバーのロード時のエラーを解決するためにそれを使用したことを示しているようです (この問題を参照)。
問題の詳細
Jaybird は、Type 4 プロトコル、カスタムの Type 4 Open Office プロトコル、Type 2 埋め込み (ネイティブ) プロトコル、Type 2 ネイティブ クライアント プロトコルなど、サポートされているプロトコルのプラグインを使用します。また、サードパーティがこれを使用して、Oracle 固有の構文を Firebird 構文に変換するドライバーを提供したこともあると思います。
これらのプラグインはすべて にリストされMETA-INF/services/org.firebirdsql.gds.impl.GDSFactoryPlugin
、同様の方法でロードされますjava.util.ServiceLoader
(現在の 2.2.x ドライバーは Java 5 をサポートしているため、実際には を使用しませんServiceLoader
)。今後のバージョンでは、サポートされている接続エンコーディングと (ワイヤ) プロトコル定義にもこれを使用する予定でした。これにより、「カスタム」エンコーディング定義 (サポートされているエンコーディングを拡張する、または別のエンコーディングを使用するなど) または異なるプロトコルの実装 (トラブルシューティング、カスタム ロギングなど) が可能になります。
ここで実際の問題は、Netbeans ウィザードのHibernate Mapping Files and POJOs from Databaseがカスタム クラスローダー ( org.netbeans.modules.hibernate.util.CustomClassLoader
) を使用し、このクラスローダーが のファイルを無視することですMETA-INF/services
。問題があるのはこのウィザードだけであることに注意してください。Netbeans 自体は問題なくドライバを使用できます。
コード無視META-INF/services
:
@Override
public URL findResource(String name) {
return name.startsWith("META-INF/services") ? null : super.findResource(name); //NOI18N
}
@Override
public Enumeration<URL> findResources(String name) throws IOException {
if (name.startsWith("META-INF/services")) { //NOI18N
return Collections.enumeration(Collections.<URL>emptyList());
} else {
return super.findResources(name);
}
}
これにより、プラグインが検出されず、ドライバにプロトコルがないNullPointerException
ため、接続が作成されないため、内部 Netbeans が発生します。