この質問は、アタッチ ライブラリの動的読み込みの問題を解決するための次のステップです。私はこのようなものを持っています:
public static void loadAttachProvider(String binPath) throws Exception {
/*
* If AttachProvider is already available now then propably we are in JDK
* or path to attach.dll was specified as java.library.path on startup
*/
if (isAttachProviderAvailable()) return;
/*
* In normall-use code I have generated binPath appropriate to platform (VM)
* family and bitness (e.g. win32 or win64)
*/
System.setProperty("java.library.path", binPath);
// Reload library path hack
Field sys = ClassLoader.class.getDeclared("sys_paths");
sys.setAccessible(true);
sys.set(null, null);
// Here I want to be sure that AttachProvider is available
//System.loadLibrary("attach"); <- I'm try this too, but it's not suffiecient
if (!isAttachProviderAvailable()) {
throw new IOException("AttachProvider not available");
}
}
AttachProvider の可用性の確認は次のようになります。
public static boolean isAttachProviderAvailable() {
// This line is a substance of AttachProvider.providers() method
ServiceLoader<AttachProvider> providers = ServiceLoader.load(AttachProvider.class, AttachProvider.class.getClassLoader());
try {
for (Iterator<AttachProvider> it = providers.iterator(); it.hasNext();) {
/*
* In normall-use code the "windows" constant is replaced
* by something like platform-specific PLATFORM_FAMILY
*/
if (it.next().type().equals("windows")) return true;
}
} catch (ServiceConfigurationError ex) {}
return false;
}
これをJDKのプライベートJREで実行すると、JDKにattach.dll
はデフォルトのライブラリパスがあるため、すべて問題ありません。
問題
isAttachProviderAvailable
これは、最初の出現を削除した場合にのみうまく機能します。これは、使用可能になる前にインスタンス化しようとすると、後でロードされたAttachProvider
ときにインスタンス化できないためです。新しいライブラリ パスに従って更新されません。これを解決するには?インスタンス化せずに可用性を確認する方法、または更新する方法は?attach.dll
ServiceLoader
AttachProvider
ServiceLoader