JAR文件中加载类,并得到它的路径(Load class within Jar file and g

2019-10-18 14:06发布

我知道已经有很多类似的问题在这里,但我不能得到任何聪明形成它们。 我想加载一个JAR文件中的一类,在这一点上,这是没有问题的,但是当我想的路径传递给我自己的ClassLoader它抛出一个异常,它无法找到类。 是否有可能加载使用绝对路径罐内一类? 例如,
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"); (返回一个空)

Answer 1:

您可以使用获得的URL类路径的资源中ClassLoader.getResources 。 若要寻找特定类别的罐子,你可以使用以下

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

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

ClassLoader classLoader = ClassLoader.getSystemClassloader();

否则,你需要知道的jar文件的位置提前,并创建一个实例URLClassLoader ,经过罐子在构造函数:

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

然后用它来加载类。



Answer 2:

如果您要访问的文件在你的jar文件,你必须把它放在同一个目录中的类文件。

例如,如果Main.class在斌/我的/包装/ Main.class可以存储在同一目录中MyPlugin.class(斌/我的/包装/ MyPlugin.class),然后,如果你想访问该文件使用

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

它采用Main.class的位置,你的项目为根。

希望能帮助到你!



文章来源: Load class within Jar file and get it's path