在Jar文件中加载类并获取它的路径

时间:2013-09-03 14:32:25

标签: 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)

2 个答案:

答案 0 :(得分: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是应用程序类路径的一部分,则可以使用system classloader:

ClassLoader classLoader = ClassLoader.getSystemClassloader();

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

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

然后用它来加载你的课程。

答案 1 :(得分:0)

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

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

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

以root身份使用项目中Main.class的位置。

希望它有所帮助!