java - 在 Jar 文件中加载类并获取其路径

标签 java plugins jar classloader urlclassloader

我知道这里已经有很多类似的问题,但我无法从它们中得到任何更聪明的答案。我想在 jar 文件中加载一个类,此时这没有问题,但是当我想将路径传递给我自己的 ClassLoader 时,它会抛出一个异常,它找不到该类。是否可以使用绝对路径在 jar 中加载类?例如,
Class cls = loader.loadClass(/path/MyPlugin.jar/MyPlugin.class);

但是当我这样做时:

File test = new File("path/plugins/MyPlugin.jar/MyPlugin.class");
System.out.println(test.exists());

它打印出错误。我尝试使用 MyPlugin.jar!/MyPlugin.classMyPlugin.jar.jar!MyPlugin.class 我有时在网上看到过,尽管我不这样做不太明白这意味着什么...

当我这样做时,它会找到该类:

URLClassLoader loader = new URLClassLoader(new URL[] { "path/plugins/MyPlugin.jar" });
Class cl = loader.loadClass("MyPlugin");

但是现在我怎样才能收到路径呢?类似于 URL url = cl.getResource("MyPlugin"); (返回 null)

最佳答案

您可以使用 ClassLoader.getResources 获取类路径资源的 URL 。要查找具有特定类的 jar,您可以使用以下

URL url = classLoader.getResource("com/example/SomeClass.class");
JarURLConnection connection = (JarURLConnection) url.openConnection();
JarFile file = connection.getJarFile();
String jarPath = file.getName();

其中classLoader是任何能够找到要加载的类的类加载器。如果 jar 是应用程序类路径的一部分,您可以使用系统类加载器:

ClassLoader classLoader = ClassLoader.getSystemClassloader();

否则,您需要事先知道 jar 文件位置,并创建一个 URLClassLoader 实例,并在构造函数中传递 jar:

ClassLoader classLoader = new URLClassLoader(new URL[]{new URL("path/to/the/jar/file.jar")});

然后用它来加载你的类。

关于java - 在 Jar 文件中加载类并获取其路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18594923/

相关文章:

java - SpringXD部署Stream时出错: StringDeserializer class could not be found

java - 经常需要重建项目

android - 如何在 Android 应用程序中包含外部 jar 以进行 Android 自定义构建

java - 用于 apache-commons 风格打包的样板 ant/maven 配置

java - static() 方法(没有任何声明)

java - 如何列出所有根集合并获取所有产品?

javascript - 我应该如何处理 Electron 中面向用户的插件?

gwt - Maven GWT 插件添加其他源目录

javascript - 将页面显示为弹出窗口

java - 替换 jar 文件中文件夹内的类文件