对于某些应用程序,我使用ZK,其他Hibernate,其他Apache Commons等。
我不想部署75MB war文件,因为它使用了大量的库。
我不想将库添加到我的tomcat lib文件夹中,也不想将其添加到其配置的类路径中,因为我可能有一个使用库x.1的旧应用程序和另一个使用库x.2的应用程序
出于这个原因,在web.xml或context.xml中有一些东西会很棒,我会说:
<classpath>/usr/local/tomcat/custom-libs/zk-5.0.4</classpath>
注意:以上是伪代码
答案 0 :(得分:36)
从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大小降为零,确保依赖项位于服务器上的正确文件夹中并上传。 Yey!不再有100 MB WAR文件。
答案 1 :(得分:19)
添加@Spider答案。
Tomcat Context持有Loader元素。根据{{3}}部署描述符(<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/resources
dir并通过Maven对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>
更新 docs <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>
答案 2 :(得分:7)
这是META-INF / context.xml文件可用于的内容。您定义了自己的WebappLoader,它为您的特定Web应用程序加载类。这是我使用的引用:http://tomcat.apache.org/tomcat-5.5-doc/config/loader.html(编辑:对于Tomcat 6:http://tomcat.apache.org/tomcat-6.0-doc/config/loader.html,对于Tomcat 7:http://tomcat.apache.org/tomcat-7.0-doc/config/loader.html)
此处的同事似乎也发布了您确切问题的解决方案(包括示例):http://java.dzone.com/articles/extending-tomcat-webapploader
答案 3 :(得分:7)
另一个有点hacky替代品。
您可以编写一个派生自urlclassloader的5-6行自定义类加载器,只需使用addUrl()方法添加类路径jar。
然后将其设置为应用程序代码中线程的上下文类加载器。
Thread.setContextClassLoader(new CustomClassloader(path, parentClassLoader)
其中父类加载器通常是
Thread.getContextClassloader()