2

我知道这里已经有很多类似的问题,但我无法从他们那里得到更聪明的答案。我想在 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.class或者MyPlugin.jar.jar!MyPlugin.class我有时在网上看到的,即使我真的不知道它是什么意思......

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

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

但是现在,我怎样才能接收到路径?类似的东西URL url = cl.getResource("MyPlugin");(它返回一个空值)

4

2 回答 2

4

您可以使用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")});

然后用它来加载你的类。

于 2013-09-03T14:35:54.820 回答
0

如果要访问 jar 文件中的文件,则必须将其放在与类文件相同的目录中。

例如,如果 Main.class 在 bin/my/pkg/Main.class 中,您可以将 MyPlugin.class 存储在同一目录 (bin/my/pkg/MyPlugin.class) 中,然后,如果您想访问该文件,请使用

URL url = Main.getResource("MyPlugin.class");

它使用项目中 Main.class 的位置作为根。

希望能帮助到你!

于 2013-09-03T14:42:05.443 回答