我正在查看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
作为主类?这样做有什么理由吗?
感谢。
答案 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中。
是的,设置一个全新的类加载器实际上是实现此目的的唯一方法。