1

私のアプリは何らかのプロセス(control-m)によって開始されます。これは、変更可能なbashスクリプトから開始されます(スクリプトは他のプロセスによって呼び出されます)。

アプリは間違ったバージョンの春で実行されています。問題は、どのjarがロードされているかはわかっていますが、クラスパスにはありません。クラスパスはbashスクリプトで提供されます。また、以下を実行して検証しました。

ClassLoader cl = ClassLoader.getSystemClassLoader();
java.net.URL[] urls = ((URLClassLoader)cl).getURLs();
for(java.net.URL url: urls){
    System.out.println(url.getFile());
}

しかし、それでもいくつかの瓶は、あるべきではないものがあります。コマンドラインに-verbose:classがあります。必要なクラスが無効なjarファイルからロードされる理由をどのように知ることができますか?なぜこれらのジャードがロードされているのですか?クラスローディングプロセスをデバッグする方法は?

ユーザーアカウントから(他のプロセスではなく)スクリプトを実行すると、すべて問題ありません。

4

1 に答える 1

0

私はその理由を見つけました。クラスパスにjarがあり、通常のユーザーがアクセスできないようにアクセス許可が設定されていましたが、control-mはアクセスできました。私のアカウントから実行すると、このjarが無視され、すべてが正常に機能していました。

しかし、control-mで実行すると、そのjarがロードされ、マニフェストに「Class-Path」エントリが追加され、クラスロードプロセスが変更されていました。

于 2013-02-27T23:12:57.020 に答える