将web应用移植到Tomcat:javax.naming.NameNotFoundException:

将web应用移植到Tomcat:javax.naming.NameNotFoundException:,java,tomcat,servlets,jdbc,web.xml,Java,Tomcat,Servlets,Jdbc,Web.xml,使用JavaSE8在Linux CentOS 7上使用Tomcat(8.5.9)的新用户。我一定是犯了个简单的错误。这应该是如何为tomcat配置JDBC连接池的教科书示例 我有一个错误: javax.naming.NameNotFoundException:Name[jdbc/pool1]在此上下文中未绑定。找不到[jdbc] 知道我做错了什么吗?Tomcat不建议将元素直接放在server.xml文件中。因此,我的设置: $CATALINA_HOME/webapps/myapp/META-I

使用JavaSE8在Linux CentOS 7上使用Tomcat(8.5.9)的新用户。我一定是犯了个简单的错误。这应该是如何为tomcat配置JDBC连接池的教科书示例

我有一个错误:

javax.naming.NameNotFoundException:Name[jdbc/pool1]在此上下文中未绑定。找不到[jdbc]

知道我做错了什么吗?Tomcat
不建议将元素直接放在server.xml文件中。
因此,我的设置:

$CATALINA_HOME/webapps/myapp/META-INF/context.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/pool1"
            auth="Container"
            type="javax.sql.DataSource"
            username="xx"
            password="xx"
            driverClassName="oracle.jdbc.OracleDriver"
            url="xx"
            maxTotal="256"
            maxIdle="8"
            initialSize="4"
            removeAbandonedTimeout="7200"
            removeAbandonedOnBorrow="true"/>

  <Resource name="jdbc/pool2"
            auth="Container"
            type="javax.sql.DataSource"
            username="xx"
            password="xx"
            driverClassName="oracle.jdbc.OracleDriver"
            url="xx"
            maxTotal="256"
            maxIdle="8"
            initialSize="4"
            removeAbandonedTimeout="7200"
            removeAbandonedOnBorrow="true"/>

  <ResourceLink name="jdbc/pool1"
                global="jdbc/pool1"
                type="javax.sql.DataSource"/>

  <ResourceLink name="jdbc/pool2"
                global="jdbc/pool2"
                type="javax.sql.DataSource"/>
</Context>
...
<resource-ref>
        <description>xxx</description>
        <res-ref-name>jdbc/pool1</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
    <resource-ref>
        <description>xxx</description>
        <res-ref-name>jdbc/pool1</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
 </resource-ref>
 ...
我根本没有修改$CATALINA_HOME/conf/server.xml。我是否配置不正确,或者在某个地方缺少设置另一个文件

更新1

我尝试将上述资源链接添加到$CATALINA_HOME/conf/server.xml文件中的GlobalNamingResources标记,然后停止/启动Tomcat,但我得到了相同的错误

更新2

然后,我将上面context.xml中的资源标记添加到server.xml文件(GlobalNamingResources标记),停止/启动tomcat,并得到相同的错误

更新3

通过改变java调用池的方式,我得到了Andreas专家的帮助(谢谢!):

Context initCtx = new InitialContext();
Context context = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) context.lookup("jdbc/pool1");
conn = ds.getConnection();  

此外,ResourceLink不应位于server.xml中(它们只是在tomcat日志中生成警告)。

您的
$CATALINA_BASE/conf/server.xml
文件应包含完整的
元素。还记得将JDBC驱动程序jar文件添加到Tomcat的
$CATALINA_BASE/lib
文件夹中,因为在
server.xml
中定义
时需要它的是Tomcat,而不是您的webapp

接下来,
META-INF/context.xml
是第一次部署webapp时使用的模板。它被复制到
$CATALINA_BASE/conf/CATALINA/localhost/myapp.xml
,如果您更改
META-INF/context.xml
,它可能不会更新/刷新

../Catalina/localhost/myapp.xml
文件应该包含
元素,将webapp使用的名称映射到
server.xml
中使用的名称。保持这两个名称相同是最简单的,但不是必需的

Tomcat在没有
WEB-INF/WEB.xml
中的
元素的情况下工作得很好,但是为了与其他Servlet容器的兼容性,如果有这些元素就更好了

注意:
$CATALINA_BASE
通常与
$CATALINA_HOME
相同,即安装Tomcat的文件夹,除非您明确配置它

所以,
$CATALINA_BASE/conf/server.xml

<?xml version='1.0' encoding='utf-8'?>
<Server ...>
    ...
    <GlobalNamingResources>
        ...
        <Resource name="jdbc/pool1" auth="Container" type="javax.sql.DataSource" ... />
        <Resource name="jdbc/pool2" auth="Container" type="javax.sql.DataSource" ... />
        ...
    </GlobalNamingResources>
    ...
</Server>
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink name="jdbc/pool1" global="jdbc/pool1" type="javax.sql.DataSource"/>
    <ResourceLink name="jdbc/pool2" global="jdbc/pool2" type="javax.sql.DataSource"/>
</Context>

然后将
ojdbcXXX.jar
放在
$CATALINA_BASE/lib

什么代码引发异常?@EJP当然,我添加了引发异常的代码,就在更新1上面。谢谢@Anderas,(1)
server.xml
文件包含完整的
元素,就像
context.xml
(2)一样Oracle的
ojdbc.jar
文件位于
$CATALINA_HOME/lib
文件夹中,(3)我没有定义
$CATALINA_BASE
,因此它应该默认为
$CATALINA_HOME
,(4)文件夹中没有文件
$CATALINA_HOME/conf/CATALINA/localhost
,Tomcat应该在那里放点什么吗?也许已经改变了。它用于复制那里的
META-INF/context.xml
文件,该文件以您的案例中的webapp
myapp.xml
命名。你自己试试吧。我从不使用
META-INF/context.xml
,它始终是一个手动配置的
conf/catalina/localhost/myapp.xml
文件,因为它取决于
server.xml
文件的配置方式。在对
conf
文件(包括子文件夹)进行更改时,请记住重新启动Tomcat(来自server.xml中的
)和
[hostname]
=
localhost
(来自
,除非您在Tomcat中进行虚拟托管)。那么您在Java代码中可能做得不对。您是否执行了
initContext.lookup(“Java:/comp/env”)。lookup(“jdbc/pool1”)
?显示代码。请参阅。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink name="jdbc/pool1" global="jdbc/pool1" type="javax.sql.DataSource"/>
    <ResourceLink name="jdbc/pool2" global="jdbc/pool2" type="javax.sql.DataSource"/>
</Context>