【问题标题】:ClassLoader loading the wrong instance of a fileClassLoader 加载错误的文件实例
【发布时间】: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


【解决方案1】:

我不确定,但似乎Thread.currentThread().getContextClassLoader().getResourceAsStream("/plugin.xml") 可以解决您的问题。如果没有,您必须创建自己的 ClassLoader 并在那里解决问题。

【讨论】:

    【解决方案2】:

    最简单的方法是将你的 jar 移到 classpath 中,使其成为第一个包含 Plugin.xml 的, 另一种方法是使用 getResource() 来定位您的 jar 文件:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多