我可以在Tomcat中为每个应用程序创建自定义类路径吗?

2022-09-01 05:47:47

对于某些应用程序,我使用ZK,其他Hibernate,其他Apache Commons等。

我不想部署一个75MB的war文件,只是因为它使用了很多库。

我不想将库添加到我的tomcat lib文件夹中,也不想将类路径添加到它的配置中,因为我可能有一个使用库x.1的旧应用程序和另一个使用库x.2的应用程序

出于这个原因,在网络.xml或上下文中有一些东西会很棒.xml我说的是:

<classpath>/usr/local/tomcat/custom-libs/zk-5.0.4</classpath>

注意:以上是伪代码


答案 1

从Tomcat 7开始,没有提到无法在生产中使用VirtualWebappLoader。我试过了,它就像一个梦。只需将以下内容添加到 META-INF/context.xml:

<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="/websandbox">
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
          virtualClasspath="/usr/.../*.jar;/usr/.../*.jar"/>
</Context>

在 Netbeans 中,在打包下,我只是取消选中所有包,将 .war 大小减小到零,确保依赖项位于服务器上的正确文件夹中并上传。是的!没有更多的100 MB WAR文件。


答案 2

@Spider答案的补充。

Tomcat Context hold Loader element.根据文档,部署描述符(标签中的内容)可以放在:<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 - 最佳 - 完全脱离应用程序并自动扫描更改!!!

在这里,我的配置演示了如何在层次结构之外使用项目文件的开发版本(请注意,我将此文件放入dir和intruct Maven中以预处理占位符,因此在新环境中构建后,我将其复制到):$CATALINA_BASEsrc/test/resources${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>

更新 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>

推荐