首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Servlet3.0的嵌入式Tomcat --如何在扫描时跳过某些jars?

问带有Servlet3.0的嵌入式Tomcat --如何在扫描时跳过某些jars?
EN

Stack Overflow用户
提问于 2013-07-12 13:46:38
回答 3查看 2.4K关注 0票数 1

下面是一个用于扫描Servlet3.0初始化器的嵌入式Tomcat服务器的简单方法:

代码语言:javascript
复制
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();
}

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

奖励:是否有一种方法可以指定要包含哪个jars而不是跳过哪个jars?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-12 18:45:09

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

答案在Groovy中(对不起,我很懒)

代码语言:javascript
复制
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);
    }
}

基本思想是,我们正在查看类加载器可以看到的所有jars,而不包括我们不想包含的所有jars。

Tomcat嵌入式启动非常快,就像这样!

票数 2
EN

Stack Overflow用户

发布于 2013-07-12 15:01:29

以下是推测,只读规格。我们可以使用一个web片段,它有自己的metadata/web.xml和元数据-完全=真正的信号,没有注释扫描。

票数 0
EN

Stack Overflow用户

发布于 2019-01-15 16:26:13

您可以将Tomcat设置scanClassPath扩展为false,类似于-这是user jkschneider here所指出的):

代码语言:javascript
复制
new Tomcat() {
    @Override
    public void start() throws LifecycleException {
        for (final org.apache.catalina.Service service : getServer().findServices()) {
            for (final Container container : service.getContainer().findChildren()) {
                for (final Container subContainer : container.findChildren()) {
                    final StandardJarScanner jarScanner = (StandardJarScanner) ((Context) subContainer).getJarScanner();
                    jarScanner.setScanClassPath(false);
                }
            }
        }
        super.start();
    }
};

顺便说一句,更好的办法可能是:

代码语言:javascript
复制
final Tomcat tomcat = new Tomcat();
final StandardHost tomcatHost = (StandardHost) tomcat.getHost();
        tomcatHost.setContextClass("com.fullclassname....FastStandardContext");

FastStandardContext在哪里

代码语言:javascript
复制
public class FastStandardContext extends StandardContext {
    public FastStandardContext() {
        ((StandardJarScanner) getJarScanner()).setScanClassPath(false);
    }
}

这将涵盖在tomcat运行后添加新的new应用程序的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17616431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档