2010-11-19 2 views
0

Ich habe einen Postgres 9.0.1 SQL Server und einen Tomcat 5.5.28 auf meinem lokalen PC eingerichtet. Beides läuft gut. Aber ich war nicht in der Lage, Tomcat zu konfigurieren, um die DataSource über JNDI verfügbar zu machen. Ich glaube, ich habe das JNDI HOW-TO von den Tomcat-Seiten bis zum Buchstaben verfolgt (und auch andere Anleitungen von anderen Seiten ausprobiert). Aber jedes Mal, Tomcat startet er zeigt die Fehlermeldung:Tomcat 5.5 erkennt DataSource beim Start nicht (Nullkomponente Catalina: type = DataSource)

SEVERE: Null component Catalina:type=DataSource,path=/MyApp,host=localhost,class=javax.sql.DataSource,name="jdbc/postgres" 

Tomcat dennoch nicht starten, aber meine Datenbank-Code wird nicht funktionieren, weil mein InitialContext.lookup mit nichts landet.

I: \ Apache Software Foundation \ Tomcat 5.5 \ common \ lib

I: \ Apache

Der Postgres-Treiber "postgresql-8.4-701.jdbc4.jar" ist in den folgenden Ordner kopiert Software Foundation \ Tomcat 5.5 \ webapps \ MyApp \ WEB-INF \ lib

Hier ist meine MeineAnw/META-INF/context.xml:

<Context path="/MyApp" docBase="MyApp" crossContext="true" reloadable="true" debug="1"> 
    <Resource name="jdbc/postgres" 
     auth="Container" 
      type="javax.sql.DataSource" 
      username="postgres" 
      password="xxx" 
      driverClassName="org.postgresql.Driver" 
      url="jdbc:postgresql://localhost/MyDatabase" 
      maxWait="1000" 
      maxActive="20" 
      maxIdle="10"> 
    </Resource> 
</Context> 

Hier ist ein Auszug aus der Liste meiner MeineAnw/WEB-INF /web.xml:

Mein Projekt wird als WAR von Eclipse bereitgestellt und Tomcat löst den WAR beim Start als Ordner aus. Nun das Seltsame: Wenn ich Tomcat nicht von Hand, sondern mit Eclipse starte, funktioniert alles !!! Tomcat kommt nicht mit der obigen Fehlermeldung auf. Ich habe entdeckt, dass Eclipse seine eigene server.xml, context.xml usw. verwendet, wenn es Tomcat selbst startet, aber selbst nachdem ich diese Dateien mit den regulären Konfigurationsdateien von Tomcat verglichen habe, ist der einzige Unterschied, den ich bisher entdeckt habe, die folgende zusätzliche Zeile im Eclipse Server .xml vor dem Schließen „host“ tag:

<Context docBase="MyApp" path="/MyApp" reloadable="true" source="org.eclipse.jst.j2ee.server:MyApp"/> 

Aber selbst wenn ich kopieren sie diese Zeile in Tomcat eigenen server.xml (ohne die „Quelle“ -Attribut), ist es nicht ohne Eclipse-arbeiten. Eclipse muss also etwas "extra" machen, was das Finden der DataSource ermöglicht, während die "normale" Tomcat-Konfiguration fehlschlägt. Da ich die WAR auf einem anderen Server (ohne Eclipse) bereitstellen muss, brauche ich Hilfe, um dies ohne Eclipse zu machen. Ich denke, mein Code ist in Ordnung, da er mit Tomcat von Eclipse funktioniert, aber meine Konfiguration von Tomcat 5.5 muss fehlerhaft sein. Irgendwelche Ideen?

Antwort

2

Nachdem ich einige Stunden mit dem Problem verbracht habe, habe ich einen Weg gefunden, Tomcat's Fehlermeldung zu vermeiden. Es scheint, dass meine Eclipse-Konfiguration fehlerhaft war, weil sie so konfiguriert wurde, dass einige Tomcat-eigene Jars in den Ordner "I: \ Apache Software Foundation \ Tomcat 5.5 \ webapps \ MyApp \ WEB-INF \ lib" hinzugefügt wurden. Nachdem ich die Einstellung von Eclipse so geändert habe, dass sie nicht mehr enthalten ist, aber diese Bibliotheken als referenzierte, wurden sie nicht mehr in der WAR-Datei enthalten und Tomcat wurde ohne Fehler gestartet. Um genau zu sein, mussten die folgenden drei Jets, die in der lib meiner Webanwendung dupliziert wurden, entfernt werden, um die Meldung "naming-factory.jar", "naming-factory-dbcp.jar" und "naming-resources.jar" zu vermeiden ".

Interessanterweise, obwohl Tomcat jetzt gut begann, blieb das Ergebnis das gleiche: Wenn aus Eclipse begonnen, meine Webapp mit dem JNDI-Suche für die Datenquelle erfolgreich sein würde, aber wenn ich Tomcat gestartet, ohne Eclipse, die Webapp würde noch fehlschlagen, wenn die Datenbank mit der Fehlermeldung unten zuzugreifen versuchen:

Cannot create JDBC driver of class '' for connect URL 'null' 

Es dauerte etwas mehr Zeit, um diese Funktion zu erhalten, auch.Ich musste die bevorzugte Methode zum Definieren einer anwendungsspezifischen Datenquelle aufgeben, sondern stattdessen eine globale definieren. Ich weiß immer noch nicht, WARUM Tomcat sich weigert, meine App-spezifischen Einstellungen zu verstehen, aber zumindest kann man das Problem umgehen. Im Folgenden sind die Schritte, die meine Probleme alle gelöst und mir erlaubt, die JNDI-Suche:

  1. die Datei server.xml in% CATALINA_HOME%/conf/server.xml innerhalb des Tags „GlobalNamingResources“ Ändern: Hier habe ich die Füllen Sie den Abschnitt "Ressource" aus, der sich bereits in meiner context.xml befand (siehe oben).

  2. Ändern der context.xml Datei in% CATALINA_HOME%/conf/context.xml innerhalb des "Context" tag: Hier habe ich die Zeile: <ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/>

Ich verließ die Webapp-spezifische Web. xml und context.xml unverändert (wie oben zu sehen). Alles funktioniert jetzt. Ich poste die Lösung für mein Problem, ich fand mich selbst in der Hoffnung, dass andere mit einem ähnlichen Problem profitieren könnten.

+0

Nur eine zusätzliche Anmerkung: Der Fehler "kann JDBC-Treiber nicht erstellen" passiert nicht mit Tomcat 7. Heute habe ich die gleiche WAR-Datei, die Tomcat 5.5. erzeugen Sie diesen Fehler bei einer Tomcat 7-Installation. Mit Tomcat 7 ist meine Problemumgehung, eine globale Ressource zu definieren, nicht notwendig - Tomcat 5.5 scheint nur Probleme mit der Art zu haben, wie ich die anwendungsspezifische Datenquelle definiert habe. – Ray

+0

In Ihrer 'MyApp/META-INF/context.xml' sollte das' Context'-Element nicht 'path' oder 'docBase' gesetzt haben, da sie bei der Definition auf Web-Anwendungsebene abgeleitet werden. siehe [Kontext bei Tomcat 5.5] (http://tomcat.apache.org/tomcat-5.5-doc/config/context.html) –