2013-07-12 69 views
1

下面是它掃描的Servlet 3.0初始化嵌入式Tomcat服務器的簡單方法:帶有Servlet 3.0的嵌入式Tomcat - 如何在掃描時跳過某些罐子?

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可以限制哪些罐進行掃描,以加快部署時間。我將如何將這個相同的想法納入到這裏的嵌入式Tomcat代碼中?

獎金:有沒有指定方式,也罐子包括而不是其中的罐子跳過

回答

2

雖然我沒有裝入個人catalina.properties性質的特定方式,我覺得不夠方便,只是超載JarScanner本身的Tomcat容器的上下文,像這樣:

答案是在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); 
    } 
} 

的基本想法是,我們正在考慮所有的類加載器可以看到罐子,並排除所有我們不希望包括罐子。

Tomcat嵌入式啓動這樣真快!

0

以下是推測性的,只能讀取規格。人們可以使用一個帶有自己的META-INF/web.xml和metadata-complete = true的web-fragment,沒有註釋掃描。

+0

謝謝喬普。我實際上想掃描註釋,只是不掃描所有內容...... – jkschneider

+0

帶有metadata-complete = true(無註釋)的web.xml和帶有metadata-complete = false的一些web-fragment(註釋)是我的想法。 –