FileNotFoundException für bean-definition-Datei passiert nur online, nicht auf localhost
Als ich veröffentlicht eine war-Datei für eine Anwendung, die lokal mit Eclipse WTP, ich hatte eine FileNotFoundException für die bean.xml Datei mit meinen Bohnen Definitionen.
SEVERE: Exception sending context initialized event to listener instance of
class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException:
IOException parsing XML document from class path resource
[META-INF/spring/beans.xml]; nested exception is java.
io.FileNotFoundException: class path resource [META-INF/spring/beans.xml]
cannot be opened because it does not exist
at Caused by: java.io.FileNotFoundException: class path resource
[META-INF/spring/beans.xml] cannot be opened because it does not exist
...
Ich erstellt die war-Datei mit mvn war:Krieg und kopiert in den webapps-Ordner von Tomcat 7.
beans.xml befindet sich in src/main/resources/META-INF/spring/beans.xml und ich hab Folgendes in meiner pom.xml:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>src/main/resources</directory>
</resource>
</webResources>
</configuration>
</plugin>
In der war-Datei beans.xml wird verpackt in META-INF/spring/beans.xml
In meinem web.xml ich habe:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:META-INF/spring/beans.xml</param-value>
</context-param>
Aber die Datei wird nicht gefunden. Wie das problem zu lösen?
UPDATE: Matthew Farwell vorgeschlagen, ist bean.xml nicht verpackt in der richtigen Lage, so dass es nicht in die Klasse Pfad, ich denke, es ist angegeben mit maven-war-plugin Parametern, die ich jetzt versuchen, Blick in die Dokumentation. Wenn jemand weiß, wäre es hilfreich.
UPDATE 2: Wie bereits in maven-war-plugin Dokumentation, gibt es einen optionalen parameter namens targetPath. Ich habe versucht, und nach dem Wechsel maven-war-plugin-Konfiguration hinzufügen targetPath wird es richtig verpackt.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>src/main/resources</directory>
<targetPath>WEB-INF/classes</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
UPDATE 3: Über Ryan Stewart ' s Vorschlag, ich begann meine erste pom-setup mit roo, aber nach, dass ich getan habe, viele Veränderungen und ich bin nicht mit roo nicht mehr. Das Verzeichnis src/main/resources wird nicht erwähnt, in anderen Orten, die in pom.xml (ich verwendet habe, grep), aber die einzige Einstellung, die sieht mir suspekt ist:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration><encoding>UTF-8</encoding></configuration>
</plugin>
Habe ich auskommentiert, die plugins, aber nichts änderte sich, dann habe ich auskommentiert, den Teil der Konfiguration des maven-war-plugin, aber src/main/resources nicht Hinzugefügt wurde, die den Krieg nicht mehr, so jetzt habe ich es wieder und ich werde es hochladen, um es zu testen-online - (es ist immer noch ein staging-server eigentlich nicht die final sowieso).
UPDATE 4 Ryan Stewart vorgeschlagen, dass das problem war, dass ich mit "mvn war:Krieg" anstelle von "mvn package", und das war ja das problem. Mit meinem targetPath, die Ressourcen erschien in WEB-INF/classes, aber es waren keine Klassen gibt.
Ich kämpfen war ein harter Kampf, während stattdessen die einfachere Lösung war, entfernen Sie den Teil der Konfiguration, wie in update 3, und mit "mvn package" zu bauen der war-Datei. Danke an Euch beide, Ryan und Matthew, nicht nur ich habe mein problem gelöst, aber ich habe auch gelernt, etwas mehr über Maven.
- ist beans.xml immer verpackt in den Krieg?
- ja, als ich schrieb: "In der war-Datei beans.xml wird verpackt in META-INF/spring/beans.xml" nun, ich bin versucht zu sagen, Maven, um es in /WEB-INF/lib/ oder /WEB-INF/classes/ Ordner
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie haben einen anderen Teil des POM, die ohne die betreffende Datei verarbeitet, als classpath-Ressource, sonst sollte es funktionieren. Entweder
classpath:
aus dem Weg. Ohne dieses Präfix, wird der Pfad angegeben incontextConfigLocation
gelöst werden gegen die Wurzel der war-Datei, und es wird richtig finden Sie Ihre Datei inMETA-INF/spring
.Wenn Sie nehmen Sie Pfad 1, dann sollten Sie entfernen Sie die
webResources
Abschnitt, oder Sie werden am Ende mit der Datei an zwei Orten-nicht problematisch, aber möglicherweise verwirrend.mvn war:war
. Das komplett überspringt den normalen build-lifecycle, die ist, wo Sie die classpath-Ressourcen werden kopiert und die Dateien kompiliert werden, etc. Gibt es einen Grund, Sie sind nicht mitmvn package
zu bauen, die den Krieg? Das ist der normale Weg, es zu tun, und Sie werden keine Ressourcen-Probleme dann. Abgesehen davon, wissen Sie, dass wenn Sie ändern .java-Datei, und führen Siewar:war
ist, die Datei nicht neu kompiliert bekommen? Das ist, warum Sie wollen würde, um zu verwendenpackage
es sei denn, es gibt einen sehr spezifischen Grund nicht zu.In einem Krieg, /ist nicht Teil des classpath für eine webapp. Der classpath enthält /WEB-INF/classes und alle jar-Dateien in /lib. Sehen Apache Tomcat 6.0 - Class Loader HOW-TO
Andere Webserver haben ähnliche Regeln. Wenn Sie möchten, Referenz etwas als Teil des classpath, steckte es in WEB-INF/classes.