2

我正在查看 Yahoo 的 YUI 压缩器可执行 jar,他们有这个类,从 Manifest 文件链接为“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

这似乎是在创建一个全新的类加载器。这是一种(不完美的)机制,用于将类的独立副本加载到同一个正在运行的 JVM 中。

例如,如果 YUI 的东西使用了很多静态变量,这可能会尝试解决这个问题,因为静态变量是 per- ClassLoader

于 2009-11-11T21:04:25.830 回答
1

也许他们想将ClassLoader主线程的内容建立为与默认行为不同的内容。请参阅Thread#getContextClassLoader().

于 2009-11-11T21:07:39.883 回答
1

这里的有效成分是 JarClassLoader。这能够为您的 main 方法提供一个全新的环境,其中类路径的类和其他资源组件可以从(可能)从整个运行在其中的 jar 文件中加载。

BigJar 之类的方案使用了这种挥手方式,它允许您将一堆 jar 文件合并到一个大的(因此得名)可执行 jar 中。

是的,设置一个全新的类加载器实际上是实现这一目标的唯一方法。

于 2009-11-11T21:07:41.580 回答