# Einbindung der context.xml



## miketech (8. Jan 2014)

Hallo zusammen,

ich habe eine Webanwendung, die auf eine Datenbank zugreift. Die Credentials etc. sind in der META-INF/context.xml beschrieben.

Nun habe ich das Problem, dass ich aus einer Konsolenanwendung heraus, Teile dieser Webanwendung nutzen möchte. D.h. ich habe die entsprechenden JAR-Files eingebunden etc. 

Funktioniert auch alles soweit gut, nur der Datenbankzugriff klappt nicht.


```
Exception Description: Cannot acquire data source [java:comp/env/jdbc/MyDataSource].
Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
Exception in thread "Thread-2" java.lang.ExceptionInInitializerError
        at com.myproject.functional.systemtask.SystemTaskServerImpl$2.run(SystemTaskServerImpl.java:231)
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:comp/env/jdbc/MyDataSource].
Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:766)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:204)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:304)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
        at com.myproject.data.access.database.DatabaseAccess.<clinit>(DatabaseAccess.java:16)
        ... 1 more
Caused by: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:comp/env/jdbc/MyDataSource].
Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:520)
        at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:109)
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.setOrDetectDatasource(DatabaseSessionImpl.java:204)
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:741)
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:239)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:685)
        ... 6 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:404)
        at javax.naming.InitialContext.lookup(InitialContext.java:415)
        at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:103)
        ... 11 more
```

Es liegt vermutlich daran, dass er in dieser Form die Daten aus der context.xml nicht ausliest, weil das ja normalerweise Aufgabe des Tomcats ist. Wie kann ich das Problem denn lösen? Kann ich die context.xml irgendwie laden?

Viele Grüße

Mike


----------



## turtle (8. Jan 2014)

> Nun habe ich das Problem, dass ich aus einer Konsolenanwendung heraus, Teile dieser Webanwendung nutzen möchte.


JNDI Zugriffe aus einer stand-alone Anwendung musst du anders handhaben, denn normalerweise stellt ein Container die "Umgebung" bereit, wie du auch schon richtig bemerkt hast. Und diese Umgebung musst du in einer Standalone-Anwendung bereit stellen.

Hier steht eine kleine Beschreibung, was ungefähr zu tun ist.

Aber dies kümmert sich "nur" um JNDI. Das Laden und Parsen der context.xml musst du dann auch noch machen.

Vielleicht ist es eine Idee, die DB-Konfiguration extern (properties-Datei?) zu halten und die Konfiguration anzupassen, die Einträge aus der properties-Datei zu verwenden. Also praktisch umgekehrte Denkweise: Statt Konsolen-Anwendung anzupassen, die WebAnwendung anpassen die gemeinsame Konfiguration zu verwenden,

Habe ich zwar noch nie gemacht, aber mit einem ResourceLink  EIntrag in der context.xml könnte das klappen.

 Hier ein Link wo das mal gemacht wurde,


----------



## miketech (8. Jan 2014)

Hi,

nette Idee, danke! Werde das mal so versuchen.

Viele Grüße

Mike


----------



## turtle (8. Jan 2014)

> Kann ich die context.xml irgendwie laden?


Das war auch eine der Fragen und ich gebe noch zu Protokoll, das natürlich geht.

Bleibt die Frage, wie du am besten die XML-Datei parsed. Ich würde das wohl mit XPath machen.

Ist je nach Komplexität der context.xml und wie häufig du das machen musst (beispielsweise verschieden context.xml parsen) einfach bis recht komplex.


----------

