Java 在Jar文件中加载类并获取它';s路径

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");

我知道这里已经有很多类似的问题了,但我无法从中得到更聪明的答案。我想在jar文件中加载一个类,这一点没有问题,但是当我想将路径传递给我自己的类加载器时,它抛出一个异常,它找不到该类。是否可以使用绝对路径在jar中加载类?例如,
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