2012-03-19 123 views
2

所以我看到已经有一个帖子非常类似于这个问题,但是我处于一种情况,我没有权力指定这个文件在我的jar中的位置,所以我希望有人知道解决方案来解决这个问题。ClassLoader加载文件的错误实例

所以我目前使用下面的代码片段来获取一个文件作为输入流,文件'plugin.xml'位于jar的根目录,我不能改变这个位置作为另一个软件(dynatrace)创建这个文件并确定它的位置。

标准片段:

InputStream is = JmxPlugin.class.getResourceAsStream("/plugin.xml");

现在我知道,问题是ClassLoader是拿起沿着类路径的名称相匹配“的plugin.xml”(第一个文件其中一个ISN在我的罐子里,耶)。

任何人都可以想到一种方法来确保我拿起正确的文件,而不必移动它?我的类在jar中的相对路径是com/something/jmx/JmxPlugin.class。

(Id而不必将jar打开到内存中)。

非常感谢任何捐款,

+0

我很困惑你的措辞。如果您的文件位于路径根目录下的jar文件中,并使用“plugin.xml”,那么这是您在调用中需要使用的路径。如果它在foo包中,那么你需要“foo/plugin.xml” - 那么问题是什么?如果你知道在你的jar文件中你想要的文件的位置,那么只需传入文件的位置。 – Jon 2012-03-19 16:41:37

+0

我看不到我的措辞不清楚:S基本上发生了什么是:ClassLoader找到另一个文件,也称为' plugin.xml'放在另一个jar中,它位于classpath之前的jar中,所以当它首先发现它基本上是这样说的时候,“哦,我找到了'plugin.xml',这是一个!而不是...... – buymypies 2012-03-19 16:49:33

+0

你忘了提及有多个罐子参与。通过阅读你的问题,这听起来像你在一个罐子里谈论重复的文件。无论如何,假设这两个jar文件中的两个文件都有完全相同的路径,那么您可以使用ClassLoader.getResources(“path/in/both/jars”),它将返回表示与该路径匹配的东西的资源的Enumeration。然后你必须确定哪个是正确的。否则,你将不得不实现你自己的ClassLoader来解决这个问题。 – Jon 2012-03-19 17:09:39

回答

0

我没有绝对的把握,但好像Thread.currentThread().getContextClassLoader().getResourceAsStream("/plugin.xml")可以解决您的问题。如果没有,你必须创建你自己的ClassLoader并解决那里的问题。

+0

谢谢,但我已经试过这个没有运气:( – buymypies 2012-03-19 16:23:06

0

的simplies办法是将你的罐子在classpath中是第一个包含plugin.xml中, 另一种方法是使用getResource()方法来查找您的jar文件:

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

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