META-INF/persistence.xml in einer war-Datei

fsicher

Bekanntes Mitglied
Hallo allerseits

Ich möchte ein WebService mir JAX-RS (REST) implementieren und auf Tomcat 7.x laufen lassen. Dabei verwende ich auch Hibernate als OR Mapper. In einem gewöhnlichen Projekt müsste die persistence.xml Datei im Verzeichnis META-INF sein, das sich seinerseits im ROOT-Verzeichnis befindet (in eclipse im src-Verzeichnis). Nun, jetzt muss ich meine App in eine war-Datei verpacken. Wo kommt jetzt META-INF/persistence.xml hin? Denn, ein META-INF ist schon im APP-ROOT vorhanden (MANIFEST.MF)! Kommt die persistence.xml dort? Habe zwar versucht, Tomcat konnte aber danach überhaupt nicht starten. Auch mit WEB-INF/META-INF/persistence.xml hat es nicht geklappt, mit WEB-INF/classes/META-INF/persistence.xml auch nicht.

Kann mir jemand einen Tipp geben? Das Dumme ist, dass ich die Fehlermeldung nicht lesen kann: CommandPrompt wird sofort geschlossen: ein "pause" eintrag in startup.bat hilft nicht, in Log-Dateien sehe ich nur, dass mit dem deployen den Anwendung gestartet wurde: keine weitere Einträge vorhanden. Aus die Versuche mit Logging-Level-Anpassung (FINEST / ALL) in conf/loging.properties haben nicht mehr gebracht. Auch das Umleiten der Ausgabe in eine andere Datei hat nicht geholfen.

Danke für jeden Tipp.
 
APPROOT/META-INF wäre imho richtig, neben WEB-INF

Solltest Tomcat von der Kommandozeile aus starten, dann verschwindet die Konsole nciht und du kannst die Fehlermeldung lesen, oder Tomcat über die IDE starten während du entwickelst.
 
classes/META-INF/persistence.xml müsste allerdings auch ohne Probleme funktionieren. Vermutlich hast du ein noch sehr viel größeres Problem, denn die startup.bat sollte sich eigentlich nicht von selbst schließen...
 
Danke für die schnelle Antwort.

Habe es noch eimal versucht mit APPROOT/META-INF/persistence.xml. Jetzt startet er, wird aber nach dem Versuch, meine Anwendung zu deployen, beendet. Obwohl ich es von der Befehlszeile starte, wird CommandPrompt geschlossen!

In der Hoffnung, die Fehlermeldung zu sehen, habe ich jetzt Tomcat aus eclipse JEE gestartet. Die Meldung ist jetzt wie folgt:

[XML]
...
INFO: Deploying web application directory ROOT
06.06.2011 13:05:00 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory shopping
java.lang.OutOfMemoryError: PermGen space
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space[/XML]

Ich bin mir nicht sicher, ob die wirklich zutrifft! Denn, im CommandPrompt war eine klassische Fehlermeldung zu sehen (ca. 20 Zeilen). Das hier könnte evtl. eclipse-Problem sein.

====================================================================

Wenn ich meine Anwendung aus webapps entferne, funktioniert Tomcat problemlos: habe noch zwei weitere REST-WebServices am laufen! Und, die WEB-INF/web.xml sieht wie folgt aus:

[XML]
<servlet>

<servlet-name>Shopping-REST-Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Shopping-REST-Servlet</servlet-name>
<url-pattern>/rest/shopping/*</url-pattern>
</servlet-mapping>
</web-app>
[/XML]

Ich habe web.xml an sich nur koppiert und servlet-name und url-mapping angepasst.

EDIT

Es hängt in der Tat mit Speicher zusammen!!! Hier die Fehlermeldung:

[XML]INFO: Deploying web application directory ROOT
06.06.2011 13:25:27 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory shopping
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1148)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:607)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1055)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:978)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:472)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1322)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:379)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:324)[/XML]

Am Arbeitsspeicher kann es nicht liegen: habe 8 GB RAM! Muss bzw. kann man irgendwo etwas konfigurieren, damit Tomcat-JVM mehr Speicher bekommt?
 
Zuletzt bearbeitet:
Ich bin etwas weiter gekommen:
- Tomcat läuft
- Deployment funktioniert
- die persistence.xml muss in APPROOT/WEB-INF/classes/META-INF sein

Ich kann sehen, wie die Anfrage kommt. Leider scheitere ich beim Versuch, die EntityManagerFactory zu erzeugen:

Java:
entityManagerFactory = Persistence.createEntityManagerFactory("shopping");

Die persistence.xml enthält folgende Zeilen:

[XML]
...
<persistence-unit name="shopping" transaction-type="RESOURCE_LOCAL">

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<class>rest.shopping.domain.Customer</class>

...
[/XML]

Um sicher zu sein, dass mit OR-Mapper-Teil alles in Ordnung ist, habe ich diesen Teil in einem separaten Projekt getestet: es funktioniert einwandfrei. Wenn ich es aber in Tomcat ausführen möchte, geht es nicht!

Es fällt auf, dass Tomcat relativ lange braucht, bis er startet: ca. 40 Sekunden. Im lib-Directory meiner Anwendung habe ich alle Hibernate- und jersey-jar-Dateien. Dazu kommt noch der Treiber für PostgreSQL: alles in allem, ca. 13.5 MB. Die Fehlermeldung, die ich bekomme, sieht wie folgt aus:

[XML]
...
06.06.2011 22:04:39 org.apache.catalina.startup.Catalina start
INFO: Server startup in 38544 ms
59 ["http-bio-8080"-exec-3] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
63 ["http-bio-8080"-exec-3] INFO org.hibernate.cfg.Environment - Hibernate 3.6.1.Final
67 ["http-bio-8080"-exec-3] INFO org.hibernate.cfg.Environment - hibernate.properties not found
74 ["http-bio-8080"-exec-3] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
75 ["http-bio-8080"-exec-3] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
104 ["http-bio-8080"-exec-3] INFO org.hibernate.ejb.Version - Hibernate EntityManager 3.6.1.Final

EntityManagerFactory konnte nicht angelegt werden!

java.lang.OutOfMemoryError: PermGen space
Exception in thread ""http-bio-8080"-exec-3" java.lang.OutOfMemoryError: PermGen space
...
[/XML]

Was könnte ich jetzt noch machen? Bin für jeden Tipp dankbar.
 
Code:
java.lang.OutOfMemoryError: PermGen space
Exception in thread ""http-bio-8080"-exec-3" java.lang.OutOfMemoryError: PermGen space

Da steht der Fehler doch ziemlich explizit: Deine Anwendung/ der TC-Server braucht mehr Arbeitsspeicher, als momentan zur Verfügung steht. Dafür gibt es die Optionen -Xmx / -Xms bzw. -XX:MaxPermSize / -XX😛ermSize. (Bei der Sun/Oracle HotSpot VM)

Hier gibt es einen ganz gute Einführung in die Speicherarchitektur von Java: Java OutOfMemoryError – Eine Tragödie in sieben Akten | blog.codecentric.de

Für den Tomcat kannst du die Optionen in der Umgebungsvariablen JAVA_OPTS angeben: FAQ/Memory - Tomcat Wiki
 
Code:
java.lang.OutOfMemoryError: PermGen space
Exception in thread ""http-bio-8080"-exec-3" java.lang.OutOfMemoryError: PermGen space

Da steht der Fehler doch ziemlich explizit: Deine Anwendung/ der TC-Server braucht mehr Arbeitsspeicher, als momentan zur Verfügung steht. Dafür gibt es die Optionen -Xmx / -Xms bzw. -XX:MaxPermSize / -XX😛ermSize. (Bei der Sun/Oracle HotSpot VM)

Hier gibt es einen ganz gute Einführung in die Speicherarchitektur von Java: Java OutOfMemoryError – Eine Tragödie in sieben Akten | blog.codecentric.de

Für den Tomcat kannst du die Optionen in der Umgebungsvariablen JAVA_OPTS angeben: FAQ/Memory - Tomcat Wiki


Auch diese Übung (unter vielen anderen) habe ich gemacht (Anpassungen von JAVA_OPTS), hat aber auch nicht geholfen. Erst als ich die vorhandene Tomcat-Installation entfernt und Tomcat neu installiert habe, hat es funktioniert: keine Fehlermeldungen, keine Probleme. Die Anwendung funktioniert wie erwartet: WebService-Methoden können aufgerufen werden, Objekte können in PostgresSQL mit Hilfe von Hibernate gespeichert, updatet, gesucht und gelöscht werden.

Sicher ist es etwas komisch, dass man da so lange sucht, wenn man weiss, dass Tomcat in 3 Minuten neu istalliert ist. Aber, da die anderen RESTfull-Anwendungen problemlos funktionierten, sobald die neue Anwendung aus webapps entfernt wird, war ich der Meinung, dass es nicht am Tomcat liegen kann. Ein Irrtum, wie es sich herausgestellt hat. Wo aber das Problem wirklich war, kann ich nicht sagen. Am Speicher wird es wohl nicht liegen. Denn, die neue Installatin habe ich (wie üblich) bei default-Einstellungen belassen.

Vielen Dank.
 

Neue Themen


Zurück
Oben