2

私は Yahoo の YUI コンプレッサー実行可能 jar を見ていますが、マニフェスト ファイルから "Main-Class" としてリンクされたこのクラスがあります。

package com.yahoo.platform.yui.compressor;

import java.lang.reflect.Method;

public class Bootstrap {

    public static void main(String args[]) throws Exception {
        ClassLoader loader = new JarClassLoader();
        Thread.currentThread().setContextClassLoader(loader);
        Class c = loader.loadClass(YUICompressor.class.getName());
        Method main = c.getMethod("main", new Class[]{String[].class});
        main.invoke(null, new Object[]{args});
    }
}

私には役に立たないラッパーのように見えます。YUICompressorメインクラスとして直接配置しないのはなぜですか? このようにする理由はありますか?

ありがとう。

4

4 に答える 4

5

YUICompressorカスタムクラスローダー(new JarClassLoader()コードの一部)を使用してロードしています。この背後にある理論的根拠については、YUI Compressor および Java Class Loaderを参照してください。

于 2009-11-11T21:08:10.333 に答える
1

ここで有効な要素は JarClassLoader です。これにより、メイン メソッドにまったく新しい環境が提供され、クラスパスのクラスやその他のリソース コンポーネントを (おそらく) 内部で実行されている jar ファイルからロードできるようになります。

この種の手振りは、BigJar のようなスキームで使用されます。これにより、多数の jar ファイルを 1 つの大きな (名前の由来となった) 実行可能 jar にマージできます。

はい、まったく新しいクラスローダーをセットアップすることが、これを達成するための実質的に唯一の方法です。

于 2009-11-11T21:07:41.580 に答える
1

これは、まったく新しいクラス ローダーを作成しているようです。これは、クラスの独立したコピーを同じ実行中の JVM にロードするための (不完全な) メカニズムです。

たとえば、YUI が多くの静的変数を使用している場合、これはそれを回避する試みである可能性がありますClassLoader

于 2009-11-11T21:04:25.830 に答える
1

ClassLoaderおそらく、メイン スレッドの内容をデフォルトの動作とは異なるものとして確立したかったのでしょう。のドキュメントを参照してくださいThread#getContextClassLoader()

于 2009-11-11T21:07:39.883 に答える