【问题标题】:Why can't Fantom find the resource in a jar?为什么 Fantom 在 jar 中找不到资源?
【发布时间】:2011-05-13 22:40:23
【问题描述】:

我最近开始使用Fantom。我有一个包含资源的 jar 文件(在本例中为 svg 图像)。我可以很好地使用 jar 中的类,但资源不会加载:Thread.currentThread().getContextClassLoader().getResourceAsStream("name") 返回null。当我在纯 Java 上下文中使用这个完全相同的 jar 时,它可以很好地找到资源。

任何有关如何调试甚至解决此问题的建议将不胜感激。

【问题讨论】:

  • 我对 Fantom 一无所知(不过乍一看看起来很酷),但似乎正在进行一些 Classloader 操作/隔离。可能与该领域的某些事情有关,例如:fantom.org/sidewalk/topic/1208
  • 尝试使用以 / 开头的完整路径来寻址资源,看看是否有帮助。
  • “完整路径”是什么意思?资源在 jar 文件中。
  • 所以如果我理解正确的话,你想从 Fantom 访问一个 .jar 文件并且那个 .jar 文件包含一个 svg?还是反过来?

标签: java resources jar fantom


【解决方案1】:

它必须在罐子里吗?如果你直接把它粘在你的 Pod 中,你可以像这样使用access 文件:

file := Pod.find("myPod").file(`/path/to/file.ext`)

【讨论】:

  • 它在一个我想使用的罐子里,我无法控制它。
【解决方案2】:

错误的部分是Thread.currentThread().getContextClassLoader()

Java:AnyClassFromJar.class.getClassLoader() 有效

Fantom:Class.forName("AnyClassFromJar").getClassLoader() 应该可以工作

【讨论】:

    【解决方案3】:

    如果我没记错的话,.jar 文件无法访问资源,但由于.jar 文件只不过是带有精美扩展名的 Zip 文件,您可以这样打开它们。

    这是我的示例文件夹结构(但任何结构都可以)。

    ExampleDir
     |
     +--- TestZip.fan
     +--- testOpen.jar
           |
           +--- META-INF
           |     +--- email.png
           |     ...
           |...
    

    然后你像这样打开testOpen.jar

    class TestZip
    {
      static Void main(Str[] args)
      {
        jar := Zip.open(File(`testOpen.jar`))
        png := jar.contents[`/META-INF/email.png`].readAllBuf
        jar.close
      }
    }
    

    编辑:在 Fantom 板上对此进行了讨论,看来这个示例应该可行。

    buff := Interop.toFan(Class.forName("net.testOpen.Foo").getClassLoader().getResourceAsStream("email.png")),4096)
    

    【讨论】:

      【解决方案4】:

      尝试使用“/name”而不是“name”。这对我有用(在 Java 中)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        相关资源
        最近更新 更多