【发布时间】:2012-03-19 16:00:17
【问题描述】:
所以我看到已经有一篇与此问题非常相似的帖子,但是我处于无法指定此文件在我的 jar 中的位置的情况,因此希望有人知道解决方案解决这个问题。
所以我目前使用以下 sn-p 来获取一个文件作为输入流,文件“plugin.xml”位于 jar 的根目录中,我无法将该位置更改为另一个软件(dynatrace)创建此文件并确定其位置。
标准的sn-p:
InputStream is = JmxPlugin.class.getResourceAsStream("/plugin.xml");
现在我知道问题是 ClassLoader 正在拾取与类路径中名称“Plugin.xml”匹配的第一个文件(一个不在我的 jar 中,耶)。
谁能想出一种方法来确保我在不移动文件的情况下拾取正确的文件?我的类在jar中的相对路径是com/something/jmx/JmxPlugin.class。
(我宁愿不必在内存中解压 jar)。
非常感谢您的任何贡献,
【问题讨论】:
-
我对你的措辞感到困惑。如果您的文件位于路径根目录的 jar 中并且您使用“plugin.xml”,那么这就是您需要在调用中使用的路径。如果它在 foo 包中,那么您需要“foo/plugin.xml” - 那么问题是什么?如果你知道你想要的文件在你的 jar 中的位置,那么只需传入文件的位置..
-
我看不出我的措辞如何不清楚:S 基本上发生了什么:ClassLoader 在我的 jar 之前的类路径中的另一个 jar 中找到另一个名为“plugin.xml”的文件,所以当它首先发现它基本上说,“哦,我找到了'plugin.xml',就是这个!”它不是....
-
你忘了提到涉及的罐子不止一个。通过阅读您的问题,听起来您正在谈论单个 jar 中的重复文件。无论如何,假设两个文件在两个 jar 中具有完全相同的路径,您可能可以使用 ClassLoader.getResources("path/in/both/jars") 它将返回一个资源枚举,代表与该路径匹配的事物。然后,您必须确定哪个是正确的。如果做不到这一点,你将不得不实现自己的 ClassLoader 来解决这个问题。
-
试过了,它只返回错误的,不返回。
-
那么恐怕你需要一个自定义的 ClassLoader。解决 ClassPath 冲突问题一直很痛苦,我强烈建议您想出其他方法来访问此文件。
标签: java classloader inputstream