【问题标题】:Loading an external Jar file from an InputStream [duplicate]从 InputStream 加载外部 Jar 文件
【发布时间】:2012-12-06 10:14:45
【问题描述】:

可能重复:
Loading from JAR as an InputStream?

我是否可以从输入流(例如,从 url 连接)加载 jar 文件,将其加载到类加载器中并执行它? 感谢您的宝贵时间。

【问题讨论】:

  • 如何将外部 jar 文件嵌入到主 jar 文件中
  • @NidhinKrishnan 在运行时加载类是插件的常态。
  • @Vulcan 我的意思是我们可以通过更改 build.xml 中的一些代码将外部 jar 与我们的主应用程序 jar 结合起来。例如,如果我们的应用程序需要 mysql.jar,并且当我们清除和构建应用程序库时,将保存在单独的 lib 文件夹中。我们可以通过更改 build.xml 中的一些代码来防止这种情况发生,我们可以将所有库合并到主 jar 文件中

标签: java classloader inputstream


【解决方案1】:

是的; URLClassLoader 用于此目的。它可以从 URL 数组中加载类。

URL externalJar = new URL("http://example.com/app.jar");
URL localJar = new URL("C:/Documents/app.jar");
URLClassLoader cl = new URLClassLoader(URL[]{ externalJar, localJar });
Class<?> clazz = cl.loadClass("SomeClass"); // you now can load classes

如果您的InputStream 不是基于URL,您可以改为将流的内容写入一个临时 jar 文件,然后使用上述方法加载该文件。 (您可以将一个 jar 完全加载到内存中,这意味着不会创建临时文件,但是这种方法需要花费相当多的精力才能做到正确,因为您需要定义一个自定义 ClassLoader)。

【讨论】:

  • 我最终将 jar 全部加载到内存中。这花了一些时间,但它更适合我的需要。谢谢!
【解决方案2】:
   public static URL getJarUrl(final File file) throws IOException {
        return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
    }

这会正确获取 Lib 的 URL,因为 Jar 文件在尝试获取它们的 URL 时会做一些奇怪的事情。

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2014-12-30
    • 2015-08-27
    • 1970-01-01
    • 2015-07-01
    • 2011-02-06
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多