EclipseLink in eine JavaEE Tomcat Anwendung einbinden

Code-Raser

Mitglied
Hallo Leute,

ich versuche wie verzweifelt EclipseLink in eine JavaEE-Anwendung unter Tomcat einzubinden. Doch das Framework will mir mit
Java:
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("JPAWebAppTest");
nicht einmal eine einfache EntityManagementFactory erzeugen.:(

Zunächst einmal die Rahmenbedingungen der Anwendung:
  • JSP
  • Servlets
  • JSF in ferner Zukunft
  • Zunächst einmal ohne JTA
  • Keine EJB's
  • Entwicklung in der EclipseLink IDE ohne JPA Facet

Mein Vorgehen war wie folgt:

  1. Die beiden JAR’s: javax.persistence_2.0.1.v201006031150.jar und
    eclipselink.jar in den BuildPath von Eclipse einbinden.
  2. Eine entsprechende persistence.xml ins Verzeichnis
    WebContent/WEB-INF/classes/META-INF/persistence.xml ablegen.
  3. Und starten per EntityManagerFactory emf = persistence.createEntityManagerFactory("JPAWebAppTest");
    (Dies findet in einem Servlet statt.)

Gibt es noch weitere Dinge die zu tun wäre oder die es zu beachten gilt?

Beim Erzeugen der emf tritt folgende Exception auf:

Code:
SCHWERWIEGEND: Servlet.service() for servlet [meinservletpackage.ServletZwei] in context with path [/MeineWebAppRoot] threw exception [Servlet execution threw an exception] with root cause
java.lang.ClassNotFoundException: javax.persistence.Persistence
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at meinservletpackage.ServletZwei.doGet(ServletZwei.java:45)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

Kopiere ich die beiden oben gennanten Jar's ins Verzeichnis $Tomcat-Root-Dir/lib, bekomme ich folgenden neuen Fehler:

Code:
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: WebappClassLoader
  context: /MeineWebAppRoot
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@9664a1

Internal Exception: Exception [EclipseLink-30009] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while trying to load persistence unit at url: file:/G:/CLIX3/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/MeineWebApp-JPATest/WEB-INF/classes/
Internal Exception: java.lang.NullPointerException

Das scheint aber immerhin schonmal ein Fortschritt zu sein, da der ClassLoader beim laden der Servlet-Klasse, in der Zeile wo die EntityManagerFactory erzeugt wird, durchläuft. Oder?

Hoffe es hat jemand eine Idee, mir gehen Sie langsam aus.

Vorab vielen Dank für eure Hilfe.
 
M

maki

Gast
Schieb deine Jars doch ins WEB-INF/lib Verzeichnis, in $Tomcat-Root-Dir/lib hast du normalerweise nix zu suchen.
 

Code-Raser

Mitglied
Hi Maki,

vielen Dank für Deine schnelle Antwort.

Nun gut hole ich die jar’s dort wieder heraus, bekomme ich jedoch wieder erstere Fehlermeldung.
Auf das Tomcat-Lib-Verzeichnis kam ich übrigens durch dieses Tutorial:
EclipseLink/Examples/JPA/Tomcat Web Tutorial - Eclipsepedia

Sicherlich ist der ein oder andere hier auch an der persistence.xml interessiert. Ich bin mir nicht sicher, ob EclipseLink Sie überhaupt registriert. Um die Zahl möglicher Fehlerquellen zu reduzieren, habe ich darin erstmal keine Entity-Klassen (mit <class>) angegeben.

persistence.xml:

[XML]<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="JPAWebAppTest" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
</persistence-unit>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:eek:racle:thin:mad:192.168.0.3:1521:GBIR1252"/>
<property name="javax.persistence.jdbc.password" value="pw"/>
<property name="javax.persistence.jdbc.user" value="user"/>
</properties>
</persistence>
[/XML]

Da das JPA-Framework die persistence.xml möglicherweise gar nicht auffindet, habe ich die XML bereits an etliche Stellen dupliziert. Vom Workspaceverzeichnis aus in:

  • src/META-INF/persistence.xml
  • WebContent/META-INF/persistence.xml
  • WebContent/WEB-INF/persistence.xml
  • WebContent/WEB-INF/lib/persistence.xml
  • ...classes/META-INF/persistence.xml
  • ...classes/META-INF/persistence.xml
src/META-INF/persistence.xml

Wobei ich im letzten Fall die persistence.xml nicht über die IDE hinzufügen konnte.
(classes ist in Eclipse ein unsichtbarer Ordner.)

classes/META-INF/persistence.xml sollte richtig sein, oder?

Schreibe ich in die persistence.xml Unfug, so ändert es nichts an der Fehlermeldung. Gelesen wird die persistence.xml also derzeit wohl noch nicht, ehe der Error kracht.

Bin Dankbar für jeden Ratschlag.
 

Code-Raser

Mitglied
Hallo,

habe noch eine kleine Ergänzung.

Zunächst hatte ich die beiden jar's in einem Ordner lib im Rootverzeichnis meines Workspaces eingebunden. Nun habe ich diese Jar's - wie durch Maki empfohlen - nach WebContent/WEB-INF/lib verschoben und dort neu über
Project --> Properties --> Build Path --> Libaries --> Add Jars
dem Classpath hinzugefügt.

Seitdem erhalte ich wieder die selbe Fehlermeldung wie, wenn ich die Jar's im $Tomcat-Root-Dir/lib-Verzeichnis liegen habe.

Dies ist aber nicht verwunderlich:

Im Falle von Tomcat sucht der JSP-Container in diesen Verzeichnissen in folgender Reinfolge nach Jar-Archiven für seine Klassen:
  • WEB-INF/classes
  • WEB_INF/lib/
  • $CATALINA_HOME/lib
  • Verzeichnisse des classpath-Parameters im Startskript
  • Bootstrap-Verzeichnis

Die relevante Fehlermeldung scheint also weiterhin die folgende zu sein:
Code:
javax.persistence.spi.PeristenceProvider
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: WebappClassLoader
  context: /MeineWebAppRoot
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@9664a1

Internal Exception: Exception [EclipseLink-30009] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while trying to load persistence unit at url: file:/G:/CLIX3/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/MeineWebApp-JPATest/WEB-INF/classes/
Internal Exception: java.lang.NullPointerException
 
R

Randalf

Gast
persistence.xml gehört ins Verzeichnis WebContent\WEB-INF\classes\META-INF\persistence.xml
 

Randalf

Mitglied
Ein solches Verzeuchnis existiert gar nicht, es müsste glaub ich heißen
[TIPP]WebContent\META-INF\persistence.xml[/TIPP]

Ich schwöre Euch ich habe so ein Verzeichnis im Eclipse und es hat auch tadellos für 9 Monate dort gefunkt (keine weiteren eigenen Kopien von persistence.xml), aber von heute auf morgen nicht mehr. Der Tip mit src/META-INF hat dann geklappt.
 

Ähnliche Java Themen

Neue Themen


Oben