Search in sources :

Example 1 with VSCrawlerClassLoader

use of com.virjar.vscrawler.web.crawlerloader.VSCrawlerClassLoader in project vscrawler by virjar.

the class VSCrawlerManager method loadJarFile.

private CrawlerBean loadJarFile(File jarFile) throws Exception {
    ClassLoader originContextClassLoader = Thread.currentThread().getContextClassLoader();
    try {
        VSCrawlerClassLoader vsCrawlerClassLoader = new VSCrawlerClassLoader(jarFile, originContextClassLoader);
        Thread.currentThread().setContextClassLoader(vsCrawlerClassLoader);
        ClassScanner.SubClassVisitor<CrawlerBuilder> subClassVisitor = new ClassScanner.SubClassVisitor<>(true, CrawlerBuilder.class);
        // prevent scan parent class loader
        ClassScanner.scanJarFile(new JarFile(jarFile), subClassVisitor);
        if (subClassVisitor.getSubClass().size() == 0) {
            return null;
        }
        if (subClassVisitor.getSubClass().size() != 1) {
            log.error("a crawler jar can only create one crawler,but find {} in {},{}, this jar file load while be ignore", subClassVisitor.getSubClass().size(), jarFile.getAbsoluteFile(), StringUtils.join(subClassVisitor.getSubClass(), ","));
            return null;
        }
        return vsCrawlerClassLoader.loadCrawler(subClassVisitor.getSubClass().get(0).getName(), webApplicationContext);
    } finally {
        Thread.currentThread().setContextClassLoader(originContextClassLoader);
    }
}
Also used : ClassScanner(com.virjar.vscrawler.core.util.ClassScanner) VSCrawlerClassLoader(com.virjar.vscrawler.web.crawlerloader.VSCrawlerClassLoader) CrawlerBuilder(com.virjar.vscrawler.web.api.CrawlerBuilder) VSCrawlerClassLoader(com.virjar.vscrawler.web.crawlerloader.VSCrawlerClassLoader) JarFile(java.util.jar.JarFile)

Aggregations

ClassScanner (com.virjar.vscrawler.core.util.ClassScanner)1 CrawlerBuilder (com.virjar.vscrawler.web.api.CrawlerBuilder)1 VSCrawlerClassLoader (com.virjar.vscrawler.web.crawlerloader.VSCrawlerClassLoader)1 JarFile (java.util.jar.JarFile)1