Groovy Ressourcen aus dem classpath nicht geladen
Guten Tag alle.
Ich bin mit spock-framework zum testen in meinem groovy-Projekt(IDE - Intellij Idea 12.6). Meine spock-Spezifikation Klasse pass mit dem Namen auf groovy-Objekt für die Verarbeitung (die Datei liegt im classpath sicher), aber wenn ich versuche, zu bekommen, dass die Datei auf diese Weise
def resource = getClass().getClassloader().getResourceAsStream(filepath)
assert resource != null : "No input stream found for path ${filepath}"
def rootNode = new XmlParser().parse(resource)
Dann resource == null
.
Habe ich versucht zu Debuggen und in der Auswertung eines Ausdrucks windows mit diesem code getClass().getResource(fileName)
gibt Ressource.
Habe ich versucht zu überprüfen, welche classloader verwendet, im ersten Fall (in der Klasse mit dem code) und im zweiten Fall (Auswertung eines Ausdrucks Fenster).
Im ersten Fall classloader war sun.misc.Launcher$AppClassLoader@18dabf1
, aber in der Auswertung eines Ausdrucks Fenster classloader war groovy.lang.GroovyClassLoader$InnerLoader@1e69757
ich nehme an, das ist der Grund, warum meine Ressource war null.
Kann jemand mich leiten, was ich falsch mache und wie kann ich laden Sie die Ressource-Datei ?
UPDATE:
Verändert die Art resource-Datei analysiert. Wenn filepath
- vollständiger Pfad zur Datei das funktioniert, aber wenn filepath
nur Datei Namen und der Datei im classpath dann resource == null
UPDATE2:
Ändern, wie Ressourcen-Datei geladen, Aufräumen Abhängigkeiten bit und alles funktioniert, ich denke, gestern war einfach nicht mein Tag.
getClass()
, und nur, wenn Class#getResourceStream
verwendet wird (anstatt ClassLoader#getResourceStream
).InformationsquelleAutor artjomka | 2013-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das problem sehr wahrscheinlich nichts mit Spock. Es ist schwer zu sagen aus der Entfernung, was es verursacht, aber der sicherste Weg, um zu Lesen eine Ressource ist
getClass().getClassLoader().getResourceAsStream()
oderThread.currentThread().getContextClassLoader().getResourceAsStream()
je nach Umgebung.Nicht sicher, was Groovy tut, wenn Sie
new File(resource)
werden, da es keineFile(URL)
- Konstruktor (nur einFile(URI)
Konstruktor). In jedem Fall, immer eineFile
von einer Klasse Weg, sollte wenn immer möglich vermieden werden.Beachten Sie, dass das argument erwarten diese Methoden anders aus, was
getClass().getResource()
erwartet (prüfen der Dokumentation). Für die Probleme, die Sie sich selbst zu bekommen, wenn eineFile
von einer Klasse Weg, siehe weblogs.java.net/blog/kohsuke/archive/2007/04/... (Kommentar und die wichtigsten Artikel). Für die Bearbeitung einer XML-Datei, eineInputStream
funktioniert in der Regel gut.Ja, ich nehme an, Spock ist nicht das problem, muss etwas mit classloadern...
Hallo, ich denke, die Lösung ist richtig. Probieren Sie etwas wie : URI-Dateipfad =.Klasse.getResource('/path_in_classpath').toURI() File file = new File(filePath)
InformationsquelleAutor Peter Niederwieser
Dies ist wahrscheinlich aufgrund der Tatsache, dass Groovy interpretieren, die Klasse des Objekts unterschiedlich, dass das, was Sie denken, ist passiert. Finden Sie unter den folgenden anderen StackOverflow-Artikel:
Warum groovy .Klasse Rückgabe einen anderen Wert, als .getClass()
Wenn die Klasse falsch ist, dann wird der ClassLoader kann auch durch die bootstrap-loader und getClassLoader null zurück.
Anstatt also mit einer Aussage wie
geben Sie die Klasse mit einer Anweisung wie
war für mich in fast identischen Umständen.
InformationsquelleAutor Peter N. Steinmetz