理解Tomcat 6中的context.xml

6
我在Eclipse中创建了一个主要为空的动态Web项目。
它没有:
  • Servlets
  • JSP文件
web.xml为空。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>testprojekt</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

我在它的 META-INF 文件夹中添加了一个 context.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
        <Parameter name="companyName" value="My Company, Incorporated"  override="false"/>
</Context>

我将这个项目导出为WAR文件,具有以下结构:

user@system:$ tree
.
|-- META-INF
|   |-- MANIFEST.MF
|   `-- context.xml
`-- WEB-INF
    |-- classes
    |-- lib
    `-- web.xml

4 directories, 3 files

当我将项目部署到本地的Tomcat(Apache Tomcat/6.0.20)时,一切都按照预期工作。也就是说,context.xml被复制到/conf/Catalina/localhost并重命名为testprojekt.xml。
当我编辑testprojekt.xml为:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Parameter name="companyName" value="My BLAH Company, Incorporated"  override="false"/>
</Context>

我在catalina.out中看到了以下输出:
02.11.2009 13:21:35 org.apache.catalina.startup.HostConfig checkResources
INFO: Undeploying context [/testprojekt]
02.11.2009 13:21:35 org.apache.catalina.core.StandardContext resourcesStart
SCHWERWIEGEND: Error starting static Resources
java.lang.IllegalArgumentException: Document base /opt/tomcat6/webapps/testprojekt does not exist or is not a readable directory
        at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142)
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4048)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4217)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1274)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:296)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
        at java.lang.Thread.run(Thread.java:619)
02.11.2009 13:21:35 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Error in resourceStart()
02.11.2009 13:21:35 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Error getConfigured
02.11.2009 13:21:35 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Context [/testprojekt] startup failed due to previous errors
02.11.2009 13:21:35 org.apache.catalina.core.StandardContext stop
INFO: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/testprojekt] has not been started

为什么会这样?这是预期的结果吗?在context.xml中更改参数的正确方法是什么?
提前感谢。 问候,

我不理解这个问题。我认为在“当我编辑testprojekt.xml时:”部分之后,你错过了一些说明性文字。至少我可以告诉你异常消息是相当自我解释的。直接看待它。 - BalusC
请对您的代码示例进行转义,以便我们可以查看它们。 - Alexander Pogrebnyak
请仔细查看两个testprojekt.xml文件。我在第二个文件的值中添加了一个BLAH字符串。我期望在修改了这个值之后,我的Web应用程序将能够访问这些新值。但是,在保存后,我甚至无法进行到这一步,因为我会收到一个异常。我真的不理解这个异常,也不知道我的方法有什么问题。 - Carsten
2个回答

2
我认为这是Tomcat中的一个错误。我已经提交了错误报告,但他们声称它是按设计工作的。Tomcat有三种部署模式:目录、WAR和上下文片段。在您的情况下,当重新加载时,它会变得混乱。
以下是导致错误的序列:
1. 当您部署WAR时,上下文片段(META-INF/context.xml)会被复制到conf/Catalina/[host]目录中。 2. 当您修改片段时,它会正确检测到更改,从而触发重新部署。 3. 然而,它忘记了这是一个WAR部署,并将其视为目录部署。目录通过undeploy被删除,因此您会收到错误。
如果您只更改META-INF中的XML,则一切都应该正常工作。

0

你的问题有点含糊不清,但我会尽力回答。

删除你编辑过的textprojekt.xml文件,在你的项目的context.xml文件中进行相同的更改,并重新启动tomcat。

这可能是由于两个xml文件之间的冲突引起的。更改由tomcat创建的xml文件并不会更改webapp的context.xml文件。至少在我用于开发工作的tomcat6.0.18上不会更改。

希望这有所帮助。


嗯,我在Tomcat用户邮件列表上也提出了这个问题,似乎这种行为是一个BUG。 https://issues.apache.org/bugzilla/show_bug.cgi?id=47343但我想知道,为什么conf/Catalina/localhost/testprojekt.xml文件的更改会重新部署Web应用程序?我本以为它会重新加载Web应用程序!那么,放置DB配置(例如)的正确位置在哪里?您将进行更改,而无需停机时间。我猜想。 - Carsten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接