【问题标题】:Java executable jar. What does this piece of code do?Java 可执行 jar。这段代码有什么作用?
【发布时间】:2009-11-11 20:58:31
【问题描述】:

我正在查看 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 作为主类呢?这样做有什么理由吗?

谢谢。

【问题讨论】:

    标签: java executable-jar


    【解决方案1】:

    他们正在使用自定义类加载器(new JarClassLoader() 代码段)加载 YUICompressor。请参阅YUI Compressor and Java Class Loader 了解其背后的基本原理。

    【讨论】:

      【解决方案2】:

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

      如果 YUI 的东西使用了很多静态变量,例如,这可能是一种解决方法,因为静态变量是 per-ClassLoader

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2010-11-07
            • 2016-05-16
            • 1970-01-01
            • 1970-01-01
            • 2011-04-13
            • 2011-05-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多