Java可执行jar。这段代码做了什么?

时间:2009-11-11 20:58:32

标签: java executable-jar

我正在查看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 个答案:

答案 0 :(得分:5)

他们使用自定义类加载器(YUICompressor代码片段)加载new JarClassLoader()。有关此背后的基本原理,请参阅YUI Compressor and Java Class Loader

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这里的活性成分是JarClassLoader。这可以为你的main方法提供一个全新的环境,其中类路径的类和其他资源组件可以从(可能)从jar文件中加载出整个内部运行的内容。

像BigJar这样的方案使用了这种挥手动画,它允许你将一堆jar文件合并到一个大的(因此名称)可执行jar中。

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