5

私はcom.sun.tools.attachjdkから使用していtools.jarます.. 何らかの理由で、 bundled の 1 つを動的にロードする必要があります。私はこのようなものを使用しようとしています:java.library.pathattach.dllWindowsAttachProviderattach.dll

public static void main(String[] args) throws Exception {
    Path bin = Paths.get(System.getProperty("user.dir"),"bin").toAbsolutePath();
    switch (System.getProperty("os.arch")) {
        case "amd64":
            bin = bin.resolve("win64");
            break;
        default:
            bin = bin.resolve("win32");
    }
    // Dynamic setting of java.library.path only seems not sufficient
    System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + bin.toString());
    // So I try to manual loading attach.dll. This is not sufficient too.
    System.load(bin.resolve("attach.dll").toString());
    // I'm using com.sun.tools.attach in my app
    new myApp();
}

これをjdkから(通常のjreで)実行すると、私に報告されます:

java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider:
Provider sun.tools.attach.WindowsAttachProvider could not be instantiated:
java.lang.UnsatisfiedLinkError: no attach in java.library.path
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException:
no providers installed
    at com.sun.tools.attach.VirtualMachine.attach(...

-Djava.library.path起動時にポイントするように指定せずにアタッチプロバイダーをインストールする方法はattach.dll?

4

1 に答える 1

6

使用している API はloadLibrary(String)を使用しています。より明示的なload(String)を最初に呼び出すことによって、これをうまくプリエンプトする (成功させる) ことはできないようです。

そのため、 でパスを指定する必要がありますjava.library.path

このシステム プロパティは、JVM ライフサイクルの早い段階で一度設定され、標準的な方法では変更できません。

java.library.pathしたがって、従来の解決策は、JVM を起動するときに適切なものを渡すことです。

または、リフレクションを使用して JVM の起動後にこのプロパティを変更するハックを調べることもできます。私はこれらのどれも試していません。

たとえば、ここを参照してください。

System.setProperty( "java.library.path", "/path/to/libs" );

Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

ところで、既存のパスを置き換えるのではなく、カスタム パスを既存のパスの前に保留することをお勧めします。

于 2012-06-21T09:24:39.827 に答える