Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类加载器加载错误的文件实例_Java_Classloader_Inputstream - Fatal编程技术网

Java 类加载器加载错误的文件实例

Java 类加载器加载错误的文件实例,java,classloader,inputstream,Java,Classloader,Inputstream,因此,我看到已经有一篇与此问题非常类似的帖子,但是我没有权力指定此文件在我的jar中的位置,因此我希望有人知道解决此问题的方法 因此,我目前使用以下代码段获取一个文件作为输入流,“plugin.xml”文件位于jar的根目录下,我无法更改此位置,因为另一个软件dynatrace创建了此文件并确定其位置 标准代码段: InputStream=JmxPlugin.class.getResourceAsStream/plugin.xml 现在我意识到问题是类加载器正在沿着类路径拾取与名称“Plugin

因此,我看到已经有一篇与此问题非常类似的帖子,但是我没有权力指定此文件在我的jar中的位置,因此我希望有人知道解决此问题的方法

因此,我目前使用以下代码段获取一个文件作为输入流,“plugin.xml”文件位于jar的根目录下,我无法更改此位置,因为另一个软件dynatrace创建了此文件并确定其位置

标准代码段:

InputStream=JmxPlugin.class.getResourceAsStream/plugin.xml

现在我意识到问题是类加载器正在沿着类路径拾取与名称“Plugin.xml”匹配的第一个文件,这个文件不在我的jar中,耶

有人能想出一种方法来确保我在不移动文件的情况下拾取正确的文件吗?我的类在jar中的相对路径是com/something/jmx/JmxPlugin.class

我宁愿不打开内存中的jar


非常感谢您的贡献,

我不太确定,但似乎Thread.currentThread.getContextClassLoader.getResourceAsStream/plugin.xml可以解决您的问题。如果没有,您将必须创建自己的类加载器并在那里解决问题。

我不是绝对确定,但似乎Thread.currentThread.getContextClassLoader.getResourceAsStream/plugin.xml可以解决您的问题。如果没有,您将不得不创建自己的类加载器并在那里解决问题。

简单的方法是将您的jar在类路径中移动,成为第一个包含Plugin.xml的, 另一种方法是使用getResource定位jar文件:

URL myJar=JmxPlugin.class.getResource("/"+JmxPlugin.class.getName().replace(".","/")+".class");

然后使用此URL打开jar文件并提取Plugin.xml。

最简单的方法是在类路径中将jar移动到第一个包含Plugin.xml的位置, 另一种方法是使用getResource定位jar文件:

URL myJar=JmxPlugin.class.getResource("/"+JmxPlugin.class.getName().replace(".","/")+".class");

然后使用这个URL打开jar文件并提取Plugin.xml。

我被你的措辞弄糊涂了。如果您的文件位于jar中路径的根目录下,并且您使用plugin.xml,那么这就是您需要在调用中使用的路径。如果它在foo包中,那么您需要foo/plugin.xml-那么问题是什么?如果你知道你想要的文件在你的jar中的位置,那么只需传递文件的位置..我看不出我的措辞有多不清楚:基本上发生了什么:ClassLoader在另一个jar中找到另一个文件,也叫'plugin.xml',它在我的jar之前的类路径上,所以当它首先找到这个文件时,它基本上会说,哦,我找到了plugin.xml,就是这个!而且它不是……你忘了提到有不止一个罐子。通读您的问题,听起来好像您在谈论单个jar中的重复文件。无论如何,假设两个文件在两个JAR中具有完全相同的路径,您可能可以使用ClassLoader.getResourcespath/in/both/jars,它将返回一个资源枚举,表示与该路径匹配的内容。然后,您必须确定哪个是正确的。否则,您将不得不实现自己的类加载器来解决此问题。尝试过这种方法后,它只返回错误的类加载器,而不会同时返回这两个类。那么恐怕您需要一个自定义类加载器。解决类路径冲突的问题一直是一件痛苦的事情,我强烈建议你想出一些其他的方法来访问这个文件。如果您的文件位于jar中路径的根目录下,并且您使用plugin.xml,那么这就是您需要在调用中使用的路径。如果它在foo包中,那么您需要foo/plugin.xml-那么问题是什么?如果你知道你想要的文件在你的jar中的位置,那么只需传递文件的位置..我看不出我的措辞有多不清楚:基本上发生了什么:ClassLoader在另一个jar中找到另一个文件,也叫'plugin.xml',它在我的jar之前的类路径上,所以当它首先找到这个文件时,它基本上会说,哦,我找到了plugin.xml,就是这个!而且它不是……你忘了提到有不止一个罐子。通读您的问题,听起来好像您在谈论单个jar中的重复文件。无论如何,假设两个文件在两个JAR中具有完全相同的路径,您可能可以使用ClassLoader.getResourcespath/in/both/jars,它将返回一个资源枚举,表示与该路径匹配的内容。然后,您必须确定哪个是正确的。否则,您将不得不实现自己的类加载器来解决此问题。尝试过这种方法后,它只返回错误的类加载器,而不会同时返回这两个类。那么恐怕您需要一个自定义类加载器。解决类路径冲突的问题一直是一件痛苦的事情,我强烈建议您想出一些其他的方法来访问这个文件。