2010-11-22 100 views
2

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

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

+0

我对Fantom一无所知(虽然看起来很酷但很快),但似乎有一些Classloader操纵/隔离正在进行。可能与这方面的某些事情有关,例如:http://fantom.org/sidewalk/topic/1208。 – 2010-11-22 17:09:06

+0

尝试使用以/开头的完整路径解决资源问题,并查看是否有帮助。 – Knubo 2010-11-22 18:34:54

回答

1

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

的Java:AnyClassFromJar.class.getClassLoader()工作

魅影:Class.forName("AnyClassFromJar").getClassLoader()应该工作

2

它必须在罐子里吗?如果您可以直接在波德坚持下去,你可以使用access文件是这样的:

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

如果我没有记错,.jar文件不能被用于resoruces访问,但因为.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 
    } 
} 

编辑:有了这个就魅影板的讨论似乎这个例子应该工作。

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

尝试 '/名' 而不是 '名'。这适用于我(用Java)。