5

对不起,也许这个问题太傻或已经回答了,但我找不到。

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

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

4

3 回答 3

2

SystemClassLoader一个URLClassLoader。你可以试试,我把它留给你:

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");

让我知道 :)

于 2013-01-09T22:39:39.703 回答
1

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

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

于 2013-01-09T22:39:41.040 回答
1

类加载是一个复杂的过程。在所有平台上的所有运行时环境中,常规类路径 ClassLoader 可能是 URLClassLoader,但我认为不一定必须如此。

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

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

于 2015-09-16T09:25:16.150 回答