【问题标题】:remote jars in the classpath类路径中的远程 jar
【发布时间】:2013-01-09 22:34:01
【问题描述】:

对不起,这个问题可能太傻了或者已经回答了,但是我没找到。

我想知道是否有一些已知的 Java 类加载器能够接受类路径中的远程文件,即像 CLASSPATH="http://somewhere.net/library.jar:..." 这样的条目.

请注意,我不是在谈论小程序或 Java Web Start。考虑一个可以使用不同后端(例如 MySQL、Oracle)的应用程序,我想根据用户的后端偏好在 shell 脚本中准备类路径,并让类加载器下载所需的jar(本例中的 jdbc 驱动程序)来自分发服务器。我也不是在谈论 Maven(用户只是获取二进制发行版,我不想强​​迫他们从源代码构建他们需要的东西)。

【问题讨论】:

    标签: java classpath classloader remoteobject


    【解决方案1】:

    SystemClassLoaderURLClassLoader。你可以试试,我留给你:

    Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
    method.setAccessible(true);
    method.invoke(ClassLoader.getSystemClassLoader(), new Object[]{new URL("http://somewhere.net/library.jar")});  
    Class.forName("your.remote.ClassName");
    

    让我知道:)

    【讨论】:

    • 很有趣,谢谢 Luigi!该代码块有效,但是,我很惊讶我不能简单地这样做: $ export CLASSPATH=http\://somewhere.net/library.jar $ java your.remote.ClassName 不起作用,它告诉我没找到课。我还缺少什么吗?
    • 类路径仅适用于文件系统路径。它与 unix $PATH 变量的模式相同。也许您可以尝试要求 Oracle 为 Java 9 实现此功能。在类路径上指定远程 url 的问题是您需要在存储库中的某处下载 jars(就像 mvn 一样)。否则它会在启动过程中大大降低你的应用程序的速度。我认为您描述的限制是出于实际目的;但由于网络变得越来越快,这可能不会成为未来的问题(仍然......应用程序的大小也在增长,所以它仍然可能是)。
    • 我认为这将是一个不错的功能(而且显然很容易添加)。启动开销问题可以通过一些缓存机制来解决。这就是我自己想做的事情,但如果甲骨文或其他一些大玩家这样做,它会有所不同(即标准化)。还是谢谢!
    • 最佳方案是您不需要通过反射 (Class.forName()) 实例化类,而只需正常使用它们。我认为设计这样的功能并不容易。顺便说一句,一些实用程序框架实现起来会很酷(类似于 runtime 依赖系统,像 maven 一样工作):我想像 MyObjectInterface myObject = loadFrom(url) 这样的东西也可以像 maven 那样解决依赖关系;这已经成为可能,而且实施起来并不难。
    【解决方案2】:

    您可以使用URLClassLoader,但它每次都会下载文件,并且会使代码更加复杂。

    如果您已经在使用 shell 脚本,为什么不简单地使用 curl 下载 jar 并将其放在类路径中?

    【讨论】:

    • documentation 没有说它是从 http:// url 加载的?
    • 它从一个 URL 加载。它可以是任何东西,只要 JVM 有协议的实现。 JVM 知道 HTTP。
    • 确实如此 :) 如果文档说它使用URLConnection,那就太好了。
    • OTOH,除了 URLConnection 之外,它还能使用什么来连接到 URL?如果 URLClassLoader 仅限于文件,我猜他们会将其命名为 FileClassLoader 并使其采用文件参数而不是 URL :-)
    • 这有点复杂,但是是的,这是我的 B 计划,谢谢。
    【解决方案3】:

    类加载是complex process。在所有平台上的所有运行时环境中,常规类路径 ClassLoader 可能是 URLClassLoader,但我认为它不一定必须是。

    添加类路径条目的一种方法是将Class-Path: 属性添加到jarfile 的META-INF/MANIFEST.MF 文件中,该属性的空格分隔值由URLClassLoader 解析。 (Maven 将它的一些类路径条目添加到 jarfile 清单作为 file:// URI,这意味着 http://https:// 也可以工作。)所以即使你不能让基于 URL 的类路径条目在正常的 Java 类路径中工作在某些运行时环境中,您应该能够通过在清单文件中指定 URL 来使它们工作。

    (我不熟悉 Java WebStart 的工作原理,但也许这也使用了基于 URL 的类路径条目?)

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2016-09-04
      • 2015-04-01
      • 2011-03-30
      • 2010-09-16
      • 2010-12-26
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多