Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat 5.5没有';启动时无法识别数据源(空组件Catalina:type=DataSource)_Java_Eclipse_Tomcat_Datasource_Jndi - Fatal编程技术网

Java Tomcat 5.5没有';启动时无法识别数据源(空组件Catalina:type=DataSource)

Java Tomcat 5.5没有';启动时无法识别数据源(空组件Catalina:type=DataSource),java,eclipse,tomcat,datasource,jndi,Java,Eclipse,Tomcat,Datasource,Jndi,我已经在本地电脑上安装了Postgres 9.0.1 SQL server和Tomcat 5.5.28,运行良好。但是我无法配置Tomcat,使数据源通过JNDI可用。我想我已经从Tomcat页面一直遵循JNDI操作指南(也尝试了其他页面的其他操作指南)。但每次Tomcat启动时,他都会显示错误消息: SEVERE: Null component Catalina:type=DataSource,path=/MyApp,host=localhost,class=javax.sql.DataSou

我已经在本地电脑上安装了Postgres 9.0.1 SQL server和Tomcat 5.5.28,运行良好。但是我无法配置Tomcat,使数据源通过JNDI可用。我想我已经从Tomcat页面一直遵循JNDI操作指南(也尝试了其他页面的其他操作指南)。但每次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软件基金会\Tomcat 5.5\common\lib

I:\Apache软件基金会\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>

…
对工厂的Postgres资源引用
jdbc/postgres
javax.sql.DataSource
容器
Eclipse将我的项目部署为WAR,Tomcat在启动时将WAR分解为文件夹。现在奇怪的事情是:如果我不是用手启动Tomcat,而是用Eclipse启动,那么一切都正常!!!Tomcat没有出现上面的错误消息。 我发现Eclipse在启动Tomcat时使用了自己的server.xml、context.xml等,但即使将这些文件与Tomcat的常规配置文件进行了比较,到目前为止,我发现的唯一区别是Eclipse的server.xml中在关闭“host”标记之前增加了以下行:



但是,即使我将这一行复制到Tomcat自己的server.xml中(没有“source”属性),没有Eclipse它也无法工作。因此,Eclipse必须做一些“额外的”工作,使查找数据源成为可能,而“正常的”Tomcat配置失败。因为我必须在不同的服务器上部署WAR(没有Eclipse),所以我需要帮助在没有Eclipse的情况下运行WAR。我认为我的代码还可以,因为它可以与Eclipse的Tomcat配合使用,但我对Tomcat5.5的配置肯定有问题。有什么想法吗?

在这个问题上花了几个小时之后,我找到了一种避免Tomcat错误消息的方法。我的Eclipse配置似乎有问题,因为它被配置为将Tomcat自己的一些JAR添加到文件夹“I:\Apache Software Foundation\Tomcat 5.5\webapps\MyApp\WEB-INF\lib”中。在我将Eclipse的设置更改为不包含它们,而是将这些库用作引用的库之后,它们不再包含在WAR文件中,Tomcat启动时没有出错。更准确地说,我的webapp的lib中复制的以下三个jar必须删除,以避免出现这样的消息:“naming factory.jar”、“naming factory dbcp.jar”和“naming resources.jar”

有趣的是,尽管Tomcat现在启动得很好,但结果仍然是一样的:如果从Eclipse中启动,我的webapp将成功地查找数据源的JNDI,但是当我在不使用Eclipse的情况下启动Tomcat时,webapp在尝试访问数据库时仍然会失败,错误消息如下:

Cannot create JDBC driver of class '' for connect URL 'null'
我也花了更多的时间来完成这项工作。我不得不放弃定义特定于应用程序的数据源的首选方法,而是定义了一个全局数据源。我仍然不知道为什么Tomcat拒绝理解我的应用程序特定设置,但至少有一个可以绕过这个问题。以下是解决所有问题并允许我进行JNDI查找的步骤:

  • 在标记“GlobalNamingResources”中修改%CATALINA_HOME%/conf/server.xml中的server.xml文件:在这里,我添加了已经在我的context.xml中的完整的“Resource”标记部分(见上文)

  • 在“context”标记中修改%CATALINA_HOME%/conf/context.xml中的context.xml文件:这里我添加了一行:


  • 我没有改变特定于webapp的web.xml和context.xml(如上所示)。现在一切正常。我发布了我发现的问题的解决方案,希望其他有类似问题的人也能从中受益。

    还有一点需要注意:Tomcat 7不会出现“无法创建JDBC驱动程序”错误。今天我放了一个让Tomcat 5.5运行的WAR文件。在Tomcat 7安装中产生此错误。对于Tomcat 7,我定义全局资源的工作环境是不必要的-似乎Tomcat 5.5在我定义特定于应用程序的数据源的方式上有问题。在您的
    MyApp/META-INF/context.xml
    中,
    context
    元素不应该设置
    path
    docBase
    ,因为它们是在web应用程序级别定义时推断出来的。提到
    Cannot create JDBC driver of class '' for connect URL 'null'