2

Tomcat のようなアプリケーションを展開できる「アプリケーション サーバー」を作成しようとしています。アプリケーションをデプロイするときは、カスタマイズした ClassLoader インスタンスを作成し、それを使用してアプリケーション フォルダー内のクラスとリソースをロードします。ClassLoader について学ぶことはたくさんありますが、いまだに混乱しています。

私の質問は: ClassLoader インスタンスごとに異なる「クラスパス」はありますか? それとも、これらの ClassLoader インスタンスは同じ場所からリソースを探していますか?

たとえば、'app1' には にあるリソースがありapps/app1/classes/log4j.properties、'app2' にも にあるリソースがあります。app1apps/app2/classes/log4j.propertiesの ClassLoader に正しいパスでそれを読み取らせる方法は?

4

1 に答える 1

0

これは、カスタムClassLoaderに実装するためのものです。

を拡張することから始めると仮定しますURLClassLoader

'アプリケーション'を解凍/デプロイするときはvoid addURL(URL url)、クラスローダーを呼び出す必要があります。クラスローダーは、指定されたURLをURLのリストに追加して、クラスとリソースを検索します。

プロセスは次のようになります

  • アプリケーションをzip/warとして取得します
  • ディレクトリで解凍します
  • 解凍したリソース(jar、サブディレクトリなど)のリストを取得します。ここで、そのアプリケーション用にインスタンス化したクラスローダーのメソッドを呼び出します。これは次のようになります。

_

public void addClassPaths( String[] classPaths ) throws IOException {

    for ( int i = 0; i < classPaths.length; i++ ) {

        String resource = classPaths [ i ];
        File file = new File( resource ).getCanonicalFile(  );

        if ( file.isDirectory(  ) ) {

            addURL( file.toURI(  ).toURL(  ) );
        } 
        else {

            URL url = new URL( "jar", "", "file:" + file.getCanonicalPath(  ) + "!/" );

            addURL( url );
        }
    }
}
于 2012-04-10T15:04:01.523 に答える