另请参阅问题:我可以在Tomcat中基于每个应用程序创建自定义类路径吗?
Tomcat 7上下文保留Loader元素。根据文档,部署描述符(<Context>标签中的内容)可以放置在:
- $CATALINA_BASE/conf/server.xml-不好-需要重新启动服务器才能重新读取配置
- $CATALINA_BASE/conf/context.xml-不好-在所有应用程序中共享
- $CATALINA_BASE/work/$APP.war:/META-INF/context.xml-不好-需要重新包装才能更改配置
- $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml-不错,但是请看最后的选择!!
- $CATALINA_BASE/webapps/$APP/META-INF/context.xml-不错,但是请看最后的选择!!
- $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml-- 最好-完全退出应用程序并自动扫描更改!!!
在这里,我的配置演示了如何使用项目文件的开发版本而不是使用$CATALINA_BASE层次结构(请注意,我将此文件放入src/test/resourcesdir并插入Maven以预处理${basedir}占位符,pom.xml <filtering>true</filtering>因此在新环境中构建后,将其复制到$CATALINA_BASE/conf/Catalina/localhost/$APP.xml):
<Context docBase="${basedir}/src/main/webapp"
         reloadable="true">
    <!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html -->
    <Resources className="org.apache.naming.resources.VirtualDirContext"
               extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <JarScanner scanAllDirectories="true"/>
    <!-- Use development version of JS/CSS files. -->
    <Parameter name="min" value="dev"/>
    <Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/>
    <Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/>
</Context>
UPDATE  Tomcat 8更改了 <Resources>和<Loader>元素的语法,现在对应的部分如下所示:
<Resources>
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>