带有 Servlet 3.0 的嵌入式 Tomcat - 如何在扫描时跳过某些 jars? [英] Embedded Tomcat with Servlet 3.0 - How to skip certain jars when scanning?

查看:29
本文介绍了带有 Servlet 3.0 的嵌入式 Tomcat - 如何在扫描时跳过某些 jars?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个用于扫描 Servlet 3.0 初始化程序的嵌入式 Tomcat 服务器的简单方法:

Here is a simple method for an embedded Tomcat server that scans for Servlet 3.0 initializers:

public static void main(String[] args) throws ServletException, LifecycleException {
    Tomcat tomcat = new Tomcat();
    tomcat.setPort(8080);

    StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File("web").getAbsolutePath());

    //declare an alternate location for your "WEB-INF/classes" dir:     
    File additionWebInfClasses = new File("target/classes");
    VirtualDirContext resources = new VirtualDirContext();
    resources.setExtraResourcePaths("/WEB-INF/classes=" + additionWebInfClasses);
    ctx.setResources(resources);

    tomcat.start();
    System.out.println("Started");
    tomcat.getServer().await();
}

我知道 catalina.properties 中的属性 tomcat.util.scan.DefaultJarScanner.jarsToSkip 允许您限制扫描哪些 jar 以加快部署时间.我如何将同样的想法合并到这里的嵌入式 Tomcat 代码中?

I know that the property tomcat.util.scan.DefaultJarScanner.jarsToSkip in catalina.properties allows you to limit which jars are scanned to speed deployment time. How would I incorporate this same idea into the embedded Tomcat code here?

奖励:有没有办法指定要包含的 jars 而不是要跳过的 jars?

BONUS: Is there a way to specify which jars to include instead of which jars to skip?

推荐答案

虽然我没有加载单个 catalina.properties 属性的特定方法,但我发现它足够方便,只需重载JarScanner 本身在 Tomcat 容器上下文中如下所示:

While I don't have a specific way of loading individual catalina.properties properties, I found it convenient enough to just overload the JarScanner itself on the Tomcat container contexts like so:

答案在 Groovy 中(抱歉,我太懒了)

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.

The basic idea is that we are looking at all the jars which the classloader can see, and excluding all of the jars that we don't want to include.

Tomcat 内嵌的启动速度非常快!

Tomcat embedded starts up real fast like this!

这篇关于带有 Servlet 3.0 的嵌入式 Tomcat - 如何在扫描时跳过某些 jars?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆