尽管我没有特定的方式来加载单个catalina.properties
属性,但我发现它很方便,只需将JarScanner本身重载在Tomcat容器上下文中,如下所示:
(对不起,我很懒)
public static void main(String[] args) throws ServletException, LifecycleException {
Tomcat tomcat = new TomcatWithFastJarScanner()
tomcat.setPort(8080)
StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File("web").getAbsolutePath())
//declare an alternate location for your "WEB-INF/classes" dir:
VirtualDirContext resources = new VirtualDirContext()
resources.setExtraResourcePaths("/WEB-INF/classes=" + new File("target/classes"))
ctx.setResources(resources)
tomcat.start()
println "Started server on port 8080"
tomcat.getServer().await()
}
private static class TomcatWithFastJarScanner extends Tomcat {
@Override
public void start() throws LifecycleException {
getServer().findServices().each { service ->
service.getContainer().findChildren().each { container ->
container.findChildren().each { c ->
((Context) c).setJarScanner(new FastJarScanner())
}
}
}
super.start()
}
}
private static class FastJarScanner extends StandardJarScanner {
def jarsToInclude = [ 'spring-web.*' ]
@Override
public void scan(ServletContext context, ClassLoader classloader,
JarScannerCallback callback, Set<String> jarsToSkip) {
jarsToSkip = new HashSet<String>();
((urlclassloader) classloader.getParent()).getURLs().each {
def jar = it.path.find(/[^\/]+\.jar$/)
if(!jar) return
for(String inclusionPattern : jarsToInclude) {
if(jar.find(inclusionPattern))
println "including jar: " + jar
else jarsToSkip.add(jar)
}
}
super.scan(context, classloader, callback, jarsToSkip);
}
}
基本思想是,我们正在查看类加载器可以看到的所有jar,并排除了我们不想包含的所有jar。
Tomcat嵌入式可以像这样快速启动!