Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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定义默认上下文元素?_Java_Tomcat_Deployment_War_Context.xml - Fatal编程技术网

Java 如何使用Tomcat定义默认上下文元素?

Java 如何使用Tomcat定义默认上下文元素?,java,tomcat,deployment,war,context.xml,Java,Tomcat,Deployment,War,Context.xml,我们在tomcat 9(apache-tomcat-9.0.22)上部署了一个应用程序 官方文档()说可以定义默认上下文元素,但对我们不起作用 我们需要定义一个数据源和一个邮件服务器。如果我们在GlobalNamingResources中的conf/server.xml文件中定义此资源,它就会工作 <GlobalNamingResources> <Resource name="mail" type="javax.mail.Session"... /> &l

我们在tomcat 9(apache-tomcat-9.0.22)上部署了一个应用程序

官方文档()说可以定义默认上下文元素,但对我们不起作用

我们需要定义一个数据源和一个邮件服务器。如果我们在
GlobalNamingResources
中的
conf/server.xml
文件中定义此资源,它就会工作

<GlobalNamingResources>
    <Resource name="mail" type="javax.mail.Session"... />
    <Resource name="jdbc/mydb" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"... />
</GlobalNamingResources>
此解决方案可能令人满意,但我们的war文件必须具有与ROOT.war不同的名称(如MyApp_v42.war),并且它将随着每次更新而更改。我们无法在每次更新时重命名xml文件

如果我们在
$CATALINA_BASE/conf/context.xml
文件或
$CATALINA_BASE/conf/[engineame]/[hostname]/context.xml中定义资源,默认的
类似于文档的文件表示我们获得了
javax.naming.NameNotFoundException

提前谢谢

一种解决办法是:
  • conf/context.xml
    中定义资源:
这样:
  • 未修改
    conf/server.xml
    文件
  • war文件的名称不是必需的
    ROOT.xml
  • 资源在
    conf/context.xml
但是:
  • 您必须在
    conf/Catalina/localhost/
    per.war中有一个文件
  • 战争不是自动部署的
  • 如果更改根war文件的名称,则必须修改
    conf/Catalina/localhost/root.xml
    文件中的
    docBase
    属性

这些说明有缺陷,但您的思路是正确的。不要命名文件
ROOT.xml
。取而代之的是,将其命名为
MyApp.xml
,这将通过xml文件的名称定义上下文路径。更好的是,将
META-INF/context.xml
打包到WAR文件中——使用适当的WAR文件名——然后像往常一样部署WAR。Tomcat将自动在WAR文件中使用部署描述符。@ChristopherSchultz感谢您的回答。我没有指定,但我的WAR不再使用此解决方案命名为ROOT.xml。@ChristopherSchultz将
META-INF/context.xml
放入WAR文件的解决方案可以工作,但并不令人满意,因为资源依赖于服务器,并且同一个WAR可以部署在多个服务器上。所以资源必须在WAR之外定义。哦,我没有意识到您想要使用根上下文,但不想指定
ROOT.WAR
。在本例中使用
ROOT.xml
是正确的方法(在许多文章和原始文档中都有介绍)
<?xml version="1.0" encoding="UTF-8"?>
<!-- Context configuration file for my web application -->
<Context>
    <Resource name="mail" type="javax.mail.Session"... />
    <Resource name="jdbc/mydb" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"... />
</Context>
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="mail" type="javax.mail.Session"... />
    <Resource name="jdbc/mydb" type="javax.sql.DataSource"... />
                               -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <Manager pathname="" />
</Context>
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="../wars/MyApp.war"></Context>