# WindowsServer (12) und Tomcat 7



## javageplagte (29. Nov 2012)

Ich hoffe, dass ich hier nicht falsch bind.

Wir haben Probleme mit Web-Applikationen und Web-Services, die in Tomcat 7 ausgeführt werden, wobei Tomcat auf Win12 Server läuft. Wenn wir Tomcat local ausführen lassen, funktioniert alles wie erwartet. Wenn wir es auf Win12 danach laufen lassen, will es nicht (auch ein 1 zu 1 Kopieren hilft nicht). Tomcat-Homepage wird erreicht, aber WebService bleibt unerreichbar. Ein weiteres Problem ist der Zugriff auf die DB, die auf dem gleichen Server ausgeführt und einer WebAnwendung angesprochen wird. Wenn eine WebAnwendung in Tomcat auf dem lokalen Sytem ausgeführt wird, kann die DB auf Win12 angesprochen werden. Versuchen wir die gleiche Anwendung in Tomcat auf dem Win12 Server auszuführen, kann sie auf die DB, die auf dem gleichen Server ausgeführt wird, nicht zugreifen. Angeblich findet man JDBC-Treiber nicht. Den Treiber haben wir aber überall gehabt: im Lib-Verzeichniss der Anwendung, im Tomcat Lib-Verzeichniss, an beiden Orten.

- JDK: 1.7
- 64 bit
- Als WS Framework wird JAX WS RI (metro 2.2.1) verwendet.
- Als DBMS wird PostgreSQL 9.x verwendet

Auf einem alten Server (Win 2012) funktioniert alles wie erwartet.

Wir haben den Server vor einer Woche aufgesetzt und sind nicht sicher, ob dies mit Konfiguration des Servers zu tun hat. Hat jemand evtl. auch solche Probleme gehabt oder weiss jemand, woran es liegen könnte?


----------



## javageplagte (30. Nov 2012)

javageplagte hat gesagt.:


> Auf einem alten Server (Win 2012) funktioniert alles wie erwartet.



Korrektur: 
Auf einem alten SErver (Win *2008*) funktioniert alles wie erwartet.


----------



## javageplagte (30. Nov 2012)

javageplagte hat gesagt.:


> Auf einem alten Server (Win 2012) funktioniert alles wie erwartet.



Korrektur: 
Auf einem alten Server (Win *2008*) funktioniert alles wie erwartet.


----------



## freez (3. Dez 2012)

Die Beschreibung kann alles, oder nichts bedeuten. Wenn die Tomcat HP funktioniert scheint es ein Problem in der WebApp selbst zu geben.

Fehlermeldungen wären hilfreich. Findet man vorwiegend im Log Ordner von Tomcat.


----------



## javageplagte (3. Dez 2012)

Das Problem mit WebService konnte etwas entschärft werden. Da wir mit JAX-WS RI arbeiten, mussten wir jetzt alle Bibliotheken direkt in das WEB-INF\lib Verz. ablegen. Dies beansprucht viel Speicher und ist nur vorübergehend als eine "Lösung" tolerierbar, bis wir weiter kommen. Alle Versuche, JAX-WS RI Bibliotheken in das <CATALINA_HOME>\lib abzulegen oder in ein <CATALINA_HOME>\shared\lib (wobei shared.loader in catalina.properties angepasst wird) haben uns nicht weiter gebracht: wir bleiben dran!

Zum Problem mit DB-Treiber:


```
[2012-11-28 01:03:35,995 / ERROR]	(Util.java:60) - EntityManager kann nicht erzeugt werden!!!

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.3.v20120629-r11760): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:30120/my_db
Error Code: 0
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:517)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:277)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:294)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:272)
	at ch.hslu.suj.rooms.util.JpaUtil.getEntityManager(Util.java:56)
	...
```

Diese Ausnahme wird in der log-Datei angezeigt. Wie schon beschrieben, haben wir mit der Treiber-Ablage sowohl im <CATALINA_HOME>\lib als auch im WEB-INF\lib versucht, ohne erfolg. 

Folgende Treiber wurden (abwechslungsweise) verwendet:
- postgresql-8.3dev-601.jdbc4.jar
- postgresql-9.2-1002.jdbc4.jar

Auf dem 2008-Server funktionieren beide, auf dem 2012-Server keiner. Nun, weiss ich im Moment nicht weiter.


----------



## JohannisderKaeufer (3. Dez 2012)

Läuft auf dem Win12 Server auch eine DB?


----------



## freez (4. Dez 2012)

javageplagte hat gesagt.:


> No suitable driver found for jdbcostgresql://localhost:30120/my_db



Ja, das klingt nicht gut. Ich hatte die Hoffnung, dass sich der Fehler doch als was anderes entpuppt, da du die üblichen Verdächtigen (WebInf/lib und Tomcat/lib) schon versucht hast und auf nem anderen Server läuft es. Aber er scheint tatsächlich nicht die passende Klasse zu finden.

Mit Administration vom Tomcat bin ich jetzt auch nicht sooo tief, aber vielleicht kann ich mal ins Blaue schiessen und ein paar Stichworte ins Rennen schicken: 

vielleicht mal andere Java Versionen versuchen?
Hast du mal geschaut, ob es mit deinerJava Version Probleme auf Win12 gibt?
Hast durchgängig die richtige 32/64Bit Versionen aller Komponenten benutzt, je nach Betriebssystem?


----------



## javageplagte (5. Dez 2012)

JohannisderKaeufer hat gesagt.:


> Läuft auf dem Win12 Server auch eine DB?



Ja, es ist auf dem gleichen Win12 Server.


----------



## javageplagte (5. Dez 2012)

freez hat gesagt.:


> vielleicht mal andere Java Versionen versuchen?
> Hast du mal geschaut, ob es mit deinerJava Version Probleme auf Win12 gibt?
> Hast durchgängig die richtige 32/64Bit Versionen aller Komponenten benutzt, je nach Betriebssystem?



Java-Version: habe mit 1.6 und 1.7 versucht, Win12 hat 1.7 installiert.
32-64 bit: alles 64 bit. Bei PostgreSQL bin ich mir nicht sicher, ob es sich um eine 64 bit Version handelt, jedoch kann ich PostgreSQL von Aussen problemlos ansprechen (PgAdmin / Applikation, die auf dem lokalen Tomcat-Server läuft). 

Einzig was ich nicht weiss: Gibt es einen 64-Bit JDBC-Triber für PostgreSQL? Auf der Download-Seite habe ich es nicht gefunden!


----------



## maki (5. Dez 2012)

> Einzig was ich nicht weiss: Gibt es einen 64-Bit JDBC-Triber für PostgreSQL? Auf der Download-Seite habe ich es nicht gefunden!


Einen UNterschied zwischen 32 und 64 Bit SW gibt es nur bei nativen Komponeten (DLLs/SOs/etc.), reines Java ist da agnostisch.
JDBC Type 4 Treiber sind reine Java Treiber, da sollte es keine expliziten 32/64 Bit Treiber geben.

Was genau ist das denn für ein Tomcat auf dem 2012 Server?
Läuft da eigentlich  Mule oder ähnliches?


----------



## javageplagte (5. Dez 2012)

Es läuft Tomcat 7.0.32 ohne weitere Bibliotheken (wie schon zuvor geschrieben haben wir jetzt für WS alle Bibliotheken der IR in das jeweilige WEB-INF\lib verpackt).


----------



## JohannisderKaeufer (6. Dez 2012)

```
Internal Exception: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:30120/my_db
```

Diese Fehlermeldung wird oft misinterpretiert.
Beim Lesen dieser Fehlermeldung gehen viele davon aus, das eine jar-Datei mit dem Treiber im cp fehlt.

Das muß allerdings nicht zwangsläufig der Fall sein. 

Um tatsächlich zu prüfen, ob der Treiber vorhanden und gefunden wird, empfehle ich ein Servlet das versucht folgenden Code auszuführen.


```
try {
  Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException cnfe) {
  System.err.println("Couldn't find driver class:");
  cnfe.printStackTrace();
}
```
bzw. 
	
	
	
	





```
new org.postgresql.Driver();
```

Damit läßt sich dann überprüfen, ob das jar tatsächlich nicht erreichbar ist.

Auch wurden zwei verschiedene Versionen von Treibern verwendet.
- postgresql-8.3dev-601.jdbc4.jar
- postgresql-9.2-1002.jdbc4.jar

Hier würde ich schauen, daß die Version zur entsprechenden DB paßt.
Außerdem würde ich empfehlen sicherzustellen, daß auch wirklich nur eine dieser beiden Dateien vorhanden ist.


----------



## javageplagte (6. Dez 2012)

Vielen Dank für den Tipp. 

Habe es (in Kürze) wie folgt gemacht:


```
PrintWriter w = new PrintWriter(response.getOutputStream());

try {
    Class.forName(org.postgresql.Driver");
    w.println("Treiber gefunden ;-)");
    w.flush();
} catch (ClassNotFoundException e){
    w.println("Treiber NICHT gefunden!");
    w.flush(); 
}
```

Die Ausgabe im Browser-Fenster hat bestätigt, dass *auch ich *die Fehlermeldung misinterpretiert habe: 

*Treiber gefunden ;-)*

Jetzt erst weiss ich nicht weiter. Woher könnte diese Meldung sonst kommen?

Folgendes kommt mir noch in den Sinn:

Ich habe in der "persistence.xml" bei dem URL sowohl mit 'localhost' als auch mit 'xxx.xxx.xxx.xxx' versucht. Könnte da evtl. was schief laufen (mit Routing)? Da der DB-Server auf dem gleichen System läuft, würde ich erwarten, dass die beiden Varianten funktionieren. Oder, bin ich da auf dem Holzweg?


----------



## javageplagte (6. Dez 2012)

Habe jetzt den Tomcat 7.0.32 aufgegeben und Tomcat 7.0.14 installiert: es funktioniert einwandfrei. Anschliessend habe ich noch einmal Tomcat 7.0.33 mit dem Installer installiert und getestet: Das gleiche Problem, die gleiche Meldung.

Ich lasse es jetzt bei tomcat 7.0.14, muss ihn aber als Service installieren versuchen. Leider ist service.bat in der Version offenbar nicht dabei. Wenn ich es aus dem CommandPrompt installieren versuche (siehe Apache Tomcat 7 (7.0.14) - Windows service HOW-TO, werde ich mit der Meldung 


```
Der Netzwerkpfad wurde nicht gefunden
```

verabschiedet. In der Anleitung ist allerdings von tomcat7.exe die Rede: diese Datei habe ich aber im bin-Verzeichnis nicht. Weiss jemand, wie ich Tomcat 7.0.14 jetzt als Dienst installieren könnte? Gibt es da evtl. Seiten, wo man mehr Infos findet?


----------



## javageplagte (6. Dez 2012)

Hat sich erledigt 

Habe apache-tomcat-7.0.14.exe herunterheladen und in bin-Verzeichnis abgelegt. Anschliessend habe ich diese exe-Datei ausgeführt, womit Tomcat als Dienst installiert werden konnte. Jetzt funktioniert alles wie erwartet. Was mit Tomcat-7.0.32 ist ...

Vielen Dank an alle.


----------

