2

Attach API を使用して実行時にいくつかのサードパーティ クラスを変更する小さなアプリケーションがあります。残念ながら、大きな問題に遭遇しました。Attach API は JDK にしか付属していません。必要なファイルはJDKからコピーしてプロジェクトに追加できますが、これを担当するライブラリ(attach.(dll|so))はできません。これは、jar 内のリソースから attach.lib をコピーして、JRE/lib ディレクトリに配置する必要があるためです。

ユーザーが Linux マシンのルート権限を持っていない場合、このアクションは機能しないため、多くのユーザーとの互換性が失われます (このアプリはサーバー上で実行することになっており、ほとんどのサーバーは Linux であるため、確信が持てません)。すべてルートです)

アタッチ API (VirtualMachine、AttachProvider など) を担当するすべてのクラスを調べましたが、ライブラリをロードしている場所が見つかりませんでした。

これを行うことは可能ですか?つまり、JDK インストールの外部で Attach API を使用できますか? もしそうなら、どのように?

4

3 に答える 3

1

これを行うには、次のように変更しjava.library.pathます。

static void addToLibPath(String path) throws NoSuchFieldException,
                                             SecurityException,
                                             IllegalArgumentException,
                                             IllegalAccessException
{
    if (System.getProperty("java.library.path") != null) {
        // If java.library.path is not empty, we will prepend our path
        // Note that path.separator is ; on Windows and : on Unix-like,
        // so we can't hard code it.
        System.setProperty("java.library.path",
                           path + System.getProperty("path.separator")
                           + System.getProperty("java.library.path"));
    } else {
        System.setProperty("java.library.path", path);
    }

    // Important: java.library.path is cached
    // We will be using reflection to clear the cache
    Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
    fieldSysPath.setAccessible(true);
    fieldSysPath.set(null, null);
}

通話addToLibPath("path")は に追加"path"されjava.library.pathます。

java.library.pathはキャッシュされており、キャッシュをクリアするにはリフレクションが必要であることに注意してください。

于 2012-09-09T22:53:27.510 に答える
0

私の知る限り、(JRE ではなく) JDK 内から「アタッチ」を行うためにアプリケーションを実行する必要があります。これにより、Attach API やその依存関係の提供について心配する必要がなくなります。これらはすべて JDK によって提供および管理されるためです。とは言っても、これを行う際に「ルート」に関する懸念はありません。JDK を抽出して任意のユーザーとして実行/使用できるためです (「ルート」としてインストール/実行する必要はありません)。とはいえ、セキュリティ制限に遭遇しないように、アタッチを行うプログラムとアタッチされるプログラムが同じ OS ユーザーとして実行されていることを確認する必要があります。

于 2012-09-08T02:28:28.617 に答える
0

私たちの経験では、完全な JDK なしで attach API を使用する信頼できる方法はありません。これは、Windows で特に深刻でした。うまくいくかもしれませんが、代わりに単純な古い JMX を調べることをお勧めします。

于 2012-09-09T22:56:57.730 に答える