Java 在Jar文件中加载类并获取它';s路径
我知道这里已经有很多类似的问题了,但我无法从中得到更聪明的答案。我想在jar文件中加载一个类,这一点没有问题,但是当我想将路径传递给我自己的类加载器时,它抛出一个异常,它找不到该类。是否可以使用绝对路径在jar中加载类?例如,Java 在Jar文件中加载类并获取它';s路径,java,plugins,jar,classloader,urlclassloader,Java,Plugins,Jar,Classloader,Urlclassloader,我知道这里已经有很多类似的问题了,但我无法从中得到更聪明的答案。我想在jar文件中加载一个类,这一点没有问题,但是当我想将路径传递给我自己的类加载器时,它抛出一个异常,它找不到该类。是否可以使用绝对路径在jar中加载类?例如,classcls=loader.loadClass(/path/MyPlugin.jar/MyPlugin.Class) 但当我这么做的时候: File test = new File("path/plugins/MyPlugin.jar/MyPlugin.class");
classcls=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=cl.getResource(“MyPlugin”)代码>(返回空)您可以使用获取指向类路径资源的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")});
然后用它来加载你的类 您可以使用获取指向类路径资源的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")});
然后用它来加载你的类 如果要访问jar文件中的文件,必须将其放在与类文件相同的目录中
例如,如果Main.class位于bin/my/pkg/Main.class中,则可以将MyPlugin.class存储在同一目录(bin/my/pkg/MyPlugin.class)中,然后,如果要访问该文件,请使用
URL url = Main.getResource("MyPlugin.class");
它使用项目中Main.class的位置作为根
希望有帮助 如果要访问jar文件中的文件,必须将其放在与类文件相同的目录中
例如,如果Main.class位于bin/my/pkg/Main.class中,则可以将MyPlugin.class存储在同一目录(bin/my/pkg/MyPlugin.class)中,然后,如果要访问该文件,请使用
URL url = Main.getResource("MyPlugin.class");
它使用项目中Main.class的位置作为根
希望有帮助 弱猜测:您是否尝试了cl.getResource()
,而不是cls.getResource()代码>?对不起,我的错,只是一个打字错误。猜得不好:你试过cl.getResource()
,而不是cls.getResource()代码>?对不起,我的错,只是一个打字错误。我试过了,尽管我不知道是否正确。这在实践中会是什么样子呢?仔细想想,手动字符串操作是不必要的。请看我的编辑。对不起,我是新来的。classloader指的是什么?所以这个例子实际上是一个叫example.jar的罐子?嗯。。。如果您知道类名和jar位置,那么可以使用我回答的第二部分中的方法。如果已经加载了类,可以使用第一部分中的建议。否则,我认为没有办法做到这一点;如果类不在类路径上,并且不知道jar包含其定义,则无法加载该类。这是因为当路径存在时,File
API不知道jar。它无法查看jar内部是否确实存在MyPlugin.class
文件。如果不更改PluginClassLoader
,恐怕您就做不到。我试过了,尽管我不知道是否正确。这在实践中会是什么样子呢?仔细想想,手动字符串操作是不必要的。请看我的编辑。对不起,我是新来的。classloader指的是什么?所以这个例子实际上是一个叫example.jar的罐子?嗯。。。如果您知道类名和jar位置,那么可以使用我回答的第二部分中的方法。如果已经加载了类,可以使用第一部分中的建议。否则,我认为没有办法做到这一点;如果类不在类路径上,并且不知道jar包含其定义,则无法加载该类。这是因为当路径存在时,File
API不知道jar。它无法查看jar内部是否确实存在MyPlugin.class
文件。如果不更改PluginClassLoader
,恐怕您无法完成此操作。这不太正确。Jar文件需要位于类路径上。将jar放在类路径上不会使其成为类路径的一部分。尝试此操作时出错URL=pluginest.getResource(“MyPlugin.class”)代码>。并在尝试此操作时接收空值:URL URL=this.getClass().getClassLoader().getResource(“MyPlugin.class”)
你知道你需要使用完全限定名,用/
代替点吗?所以我需要做这个“MyPlugin/class”?假设你的插件是com.example.MyPlugin
,你需要com/example/MyPlugin.class
。如果它在默认包中,MyPlugin.class
确实应该这样做。这不太正确。Jar文件需要位于类路径上。将jar放在类路径上不会使其成为类路径的一部分。尝试此操作时出错URL=pluginest.getResource(“MyPlugin.class”)代码>。并在尝试此操作时接收空值:URL URL=this.getClass().getClassLoader().getResource(“MyPlugin.class”)
你知道你需要使用完全限定名,用/
来代替点吗?所以我需要做这个“MyPlugin/class”?假设你的插件是com.example.MyPlu