2010-11-22 11 views
2

Ich habe vor kurzem begonnen, Fantom zu verwenden. Ich habe eine Jar-Datei, die eine Ressource enthält (in diesem Fall Svg-Image). Ich kann die Klassen aus dem Jar gut verwenden, aber die Ressource wird nicht geladen: Thread.currentThread().getContextClassLoader().getResourceAsStream("name") gibt null zurück. Wenn ich genau dieses jar in einem Nur-Java-Kontext verwende, kann es die Ressource gut finden.Warum kann Fantom die Ressource nicht in einem Glas finden?

Alle Vorschläge zum Debuggen oder sogar zum Beheben dieses Problems wären sehr willkommen.

+0

Ich weiß nichts über Fantom (sieht zwar auf den ersten Blick cool aus), aber es scheint, als würden einige Classloader manipuliert/isoliert werden. Könnte etwas mit etwas in diesem Bereich zu tun haben, zum Beispiel: http://fantom.org/sidewalk/topic/1208. –

+0

Versuchen Sie, die Ressource mit ihrem vollständigen Pfad beginnend mit/anzugehen, und sehen Sie, ob das hilft. – Knubo

+0

Was bedeutet der "vollständige Pfad"? Die Ressource befindet sich in einer JAR-Datei. – Jorn

Antwort

1

Der falsche Teil ist Thread.currentThread().getContextClassLoader()

Java: AnyClassFromJar.class.getClassLoader()

Fantom funktioniert: Class.forName("AnyClassFromJar").getClassLoader()

2

Muss es in einem Glas sein? Wenn Sie es direkt in Ihrem Pod-Stick, können Sie access Dateien wie diese verwenden:

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

Es ist in einem Glas, das ich verwenden möchte, ich habe keine Kontrolle darüber. – Jorn

0

Wenn ich mich richtig erinnere, .jar Dateien nicht für resoruces zugegriffen werden kann, aber da .jar Dateien nicht mehr als Zip-Dateien mit Phantasie sind Verlängerung können Sie sie so öffnen.

Hier ist meine Ordnerstruktur für das Beispiel (aber jede Struktur wird tun).

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

Und Sie öffnen die testOpen.jar wie folgt aus:

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

EDIT: eine Diskussion über diese auf Fantom-Boards Nachdem es scheint, dass dieses Beispiel funktionieren sollte.

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

Try/name 'anstelle von 'name' sollte funktionieren. Das funktioniert für mich (in Java).

Verwandte Themen