# EclipseLink in eine JavaEE Tomcat Anwendung einbinden



## Code-Raser (5. Apr 2011)

Hallo Leute,

ich versuche wie verzweifelt EclipseLink in eine JavaEE-Anwendung unter Tomcat einzubinden. Doch das Framework will mir mit

```
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:


Die beiden JAR’s: javax.persistence_2.0.1.v201006031150.jar und
eclipselink.jar in den BuildPath von Eclipse einbinden.
Eine entsprechende persistence.xml ins Verzeichnis
WebContent/WEB-INF/classes/META-INF/persistence.xml ablegen.
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:


```
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:


```
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.


----------



## maki (5. Apr 2011)

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


----------



## Code-Raser (5. Apr 2011)

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="jdbcracle:thin192.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 (5. Apr 2011)

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:

```
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
```


----------



## Randalf (16. Jan 2012)

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


----------



## HimBromBeere (19. Jan 2012)

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



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


----------



## mvitz (19. Jan 2012)

HimBromBeere hat gesagt.:


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



Naja, META-INF ist quasi als "Package" anzusehen, insofern, legt man bei einem Standard Eclipse Webproject einfach den Order META-INF in src an und darin die persistence.xml


----------



## Randalf (7. Nov 2012)

HimBromBeere hat gesagt.:


> 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.


----------

