2

到目前为止,我们一直在使用 Tomcat 6,我们在 $CATALINA_HOME/conf/Catalina/localhost 下的 context.xml 文件中指定要部署的战争为 application1-context.xml、application2-context.xml。等等

示例 application1-context.xml

<Context path="/myapps/app1" docBase="C:\warfiles\appOne.war"
        debug="0" privileged="true">
            <Loader className="MyCustomApplicationLoader"/>
            <Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/>         
</Context>

这将在 $CATALINA_HOME/webapps 文件夹下创建一个文件夹 myapps#app1。

但是自从迁移到 Tomcat7 之后,这种情况就不再发生了。除非我在tomcat appBase 目录下直接有war 文件“appone.war”,即$CATALINA_HOME/webapps,否则我的war 不会被解压到$CATALINA_HOME/webapps 目录下的文件夹中。

我已阅读此 apache 错误报告: https ://issues.apache.org/bugzilla/show_bug.cgi?id=51294"%3B>%3B51294<%3B/a>%3B

问题:有什么方法可以在 tomcat 7 中强制执行这种行为?

4

2 回答 2

1

听起来这个问题已在 Tomcat 版本 7.0.48中得到修复,在撰写本文时,该版本仍在开发中。它也被添加到版本 8中。

编辑:我已经设法解决了这个问题,而不必等待/使用 7.0.48。在您的 context.xml 文件中添加unpackWAR="false"并指定virtualClasspath属性,使其指向您的 target\classes 文件夹,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Context docBase="(path to .war file)">
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="(path to folder contain .class files, 
                              usually {project folder}\target\classes\)"
            searchExternalFirst="true"
            unpackWAR="false" />
</Context>
  • searchExternalFirst意味着类加载器会先查看您的virtualClasspath文件夹,然后再查看 WEB-INF 目录。
  • unpackWAR设置为 false 因为您的 war 文件已经在 /target/classes 文件夹中展开,因此 Tomcat 也不需要这样做。

希望这对您也有帮助。

于 2013-12-02T14:51:53.693 回答
0

尝试<Context unpackWARs="true" ...

conf/catalina/... 下的文件不应手动更改。如果 webapp 首次启动时不存在,它们会自动创建。您永远不应该更改这些文件,而是删除它们并让它们从 tomcat 本身创建新的(如果存在,它们由战争的/META-INF/context.xml-File 组成)。

于 2013-12-02T15:10:04.083 回答