0

この質問は、アタッチ ライブラリの動的読み込みの問題を解決するための次のステップです。私はこのようなものを持っています:

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.dllServiceLoaderAttachProviderServiceLoader

4

1 に答える 1

0

最初のアタッチチェックを次のように置き換えて解決しました:

try {
    System.loadLibrary("attach");
    if (isAttachProviderAvailable()) return;
    throw new IOException("AttachProvider not available");
} catch (UnsatisfiedLinkError ex) {
   /*
    * dll can't be loaded, so we need to specify special binpath
    * and reload library path as post above
    */
}

しかし、私はより良い解決策を待っています。

于 2012-06-26T14:46:37.027 に答える