Tomcat 5.5 не распознает источник данных при запуске (нулевой компонент Catalina: type = DataSource) - PullRequest
0 голосов
/ 19 ноября 2010

Я установил Postgres 9.0.1 SQL-сервер и Tomcat 5.5.28 на своем локальном ПК. Оба работают нормально. Но я не смог настроить Tomcat, чтобы сделать DataSource доступным через JNDI. Я думаю, что следовал инструкциям JNDI HOW-TO со страниц Tomcat к письму (а также попробовал другие инструкции с других страниц). Но каждый раз, когда Tomcat запускается, он отображает сообщение об ошибке:

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

Тем не менее Tomcat запускается, но код моей базы данных не будет работать, потому что мой InitialContext.lookup заканчивается ничем.

Драйвер postgres "postgresql-8.4-701.jdbc4.jar" копируется в следующие папки:

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

I: \ Apache Software Foundation \ Tomcat 5.5 \ webapps \ MyApp \ WEB-INF \ lib

Вот мой MyApp / 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>

Вот выдержка из моего MyApp / WEB-INF / web.xml:

<web-app>
…
<resource-ref>
    <description>
        Postgres resource reference to a factory
    </description>
    <res-ref-name>
        jdbc/postgres
    </res-ref-name>
    <res-type>
        javax.sql.DataSource
    </res-type>
    <res-auth>
        Container
    </res-auth>
  </resource-ref>
</web-app>

Eclipse развертывает мой проект как WAR, а Tomcat при запуске взрывает WAR-файл в виде папки. Теперь странная вещь: если я не запускаю Tomcat вручную, но с помощью Eclipse, все работает !!! Tomcat не выдает сообщение об ошибке выше. Я обнаружил, что Eclipse использует свой собственный server.xml, context.xml и т. Д. При запуске самого Tomcat, но даже после сравнения этих файлов с обычными конфигурационными файлами Tomcat единственное отличие, которое я обнаружил до сих пор, это следующая дополнительная строка на сервере Eclipse. xml перед закрывающим тегом "host":

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

Но даже когда я копирую эту строку в собственный файл Tomcat server.xml (без атрибута «source»), он не работает без Eclipse. Так что Eclipse должен сделать что-то «дополнительное», что делает возможным поиск источника данных, в то время как «нормальная» конфигурация Tomcat дает сбой. Поскольку мне нужно развернуть WAR-файл на другом сервере (без Eclipse), мне нужна помощь, чтобы запустить его без Eclipse. Я думаю, что мой код в порядке, так как он отлично работает с Tomcat Eclipse, но моя конфигурация Tomcat 5.5 должна быть неисправна. Есть идеи?

1 Ответ

2 голосов
/ 22 ноября 2010

Потратив еще несколько часов на решение проблемы, я нашел способ избежать сообщения об ошибке Tomcat.Кажется, моя конфигурация Eclipse была неверной, потому что она была настроена на добавление некоторых собственных jar-файлов Tomcat в папку «I: \ Apache Software Foundation \ Tomcat 5.5 \ webapps \ MyApp \ WEB-INF \ lib».После того, как я изменил настройку Eclipse, чтобы они не включались, а использовались как библиотеки со ссылками , они больше не включались в файл WAR, и Tomcat запускался без ошибок.Чтобы быть более точным, следующие три jar-файла, дублирующиеся в библиотеке моего веб-приложения, должны были быть удалены, чтобы избежать сообщения: «naming-factory.jar», «naming-factory-dbcp.jar» и «naming-resources.jar».".

Интересно, что хотя у Tomcat все начиналось нормально, результат остался прежним: если бы он запускался из Eclipse, мое веб-приложение преуспело бы с поиском JNDI для источника данных, но когда я запустил Tomcat без использования Eclipse,при попытке доступа к базе данных веб-приложение все равно не будет работать с сообщением об ошибке ниже:

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

Мне потребовалось еще немного времени, чтобы это тоже заработало.Мне пришлось отказаться от предпочтительного метода определения источника данных для конкретного приложения, но вместо этого я определил глобальный.Я до сих пор не знаю, ПОЧЕМУ Tomcat отказывается понимать настройки моего приложения, но, по крайней мере, один может обойти проблему.Ниже приведены шаги, которые решили все мои проблемы и позволили мне найти JNDI:

  1. Изменение файла server.xml в% CATALINA_HOME% / conf / server.xml внутри тега «GlobalNamingResources»: Здесь я добавил полный раздел тега «Ресурс», который уже был в моем context.xml (см. Выше).

  2. Изменение файла context.xml в% CATALINA_HOME% / conf / context.xml внутри тега «Context»: здесь я добавил строку: <ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/>

Я оставил веб-приложение, специфичное для web.xml и context.xml, без изменений (как видно выше).Все работает сейчас.Я опубликую решение своей проблемы, и я надеюсь, что другие с подобной проблемой могут выиграть.

...