嵌入式tomcat 7.0.32启动jar扫描仪

q3qa4bjr  于 2021-06-04  发布在  Flume
关注(0)|答案(3)|浏览(599)

我正在flume源代码中嵌入tomcat7.0.32。我遇到的问题是flume在类路径上放置了大量内容,在启动时,tomcat会扫描类路径以查找tld,这会导致问题,因为flume使用了通配符。
信息:正在启动servlet引擎:apache tomcat/7.0.32 2012年11月5日上午8:21:08 org.apache.catalina.startup.tldconfig tldscanjar警告:未能处理jar[jar:file:/opt/mapr/hadoop/hadoop-0.20.2/hadoop核心.jar!/]对于tld文件java.io.filenotfoundexception:/opt/mapr/hadoop/hadoop-0.20.2/hadoopcore.jar(没有这样的文件或目录),位于java.util.zip.zipfile.open(本机方法),位于java.util.zip.zipfile.(zipfile)。java:214)在java.util.zip.zipfile。java:144)在java.util.jar.jarfile中。java:152)在java.util.jar.jarfile中。java:89)在太阳网。www.protocol.jar.urljarfile.(URLjar文件。java:93)在sun.net。www.protocol.jar.urljarfile.getjarfile(URLjar文件。java:69)在sun.net。www.protocol.jar.jarfilefactory.get(1)工厂。java:88)在sun.net。www.protocol.jar.jarurlconnection.connect(1)连接。java:122)在太阳网。www.protocol.jar.jarurlconnection.getjarfile(1)连接。java:89)在org.apache.tomcat.util.scan.fileurljar。java:41)位于org.apache.tomcat.util.scan.jarfactory.newinstance(jarfactory。java:34)在org.apache.catalina.startup.tldconfig.tldscanjar(tldconfig。java:487)在org.apache.catalina.startup.tldconfig.access$100(tldconfig。java:58)在org.apache.catalina.startup.tldconfig$tldjarscannercallback.scan(tldconfig。java:303)在org.apache.tomcat.util.scan.standardjarscanner.process(standardjarscanner。java:241)在org.apache.tomcat.util.scan.standardjarscanner.scan(standardjarscanner。java:204)在org.apache.catalina.startup.tldconfig.execute(tldconfig。java:277)
在我的代码中,我曾尝试禁用此扫描,甚至尝试在上下文中将jarscanner设置为null。但这并没有帮助。下面是我的代码:

File docBase = new File(System.getProperty("java.io.tmpdir"));
    System.out.println("------- " + docBase.getAbsolutePath());

    String servletName = "1 source";

    Tomcat tomcat = new Tomcat();
    tomcat.setPort(8080);
    tomcat.setBaseDir(docBase.getAbsolutePath());

    Context context = tomcat.addContext("", docBase.getAbsolutePath());
    context.setIgnoreAnnotations(true);
    context.setJarScanner(null);

    Tomcat.addServlet(context, servletName, new HttpServlet() {
bq9c1y66

bq9c1y661#

试试这个!context=tomcat.addwebapp(“/d”,“d:/”);jarscanner jarscanner=新建jarscanner(){

@Override
        public void scan(ServletContext arg0, ClassLoader arg1,
                JarScannerCallback arg2, Set<String> arg3)
        {
            //do nothing
        }
    };
    context.setJarScanner(jarScanner);
rjee0c15

rjee0c152#

您可以在tomcat.addwebapp()之前禁用扫描类路径和清单:

ContextConfig contextConfig = new ContextConfig() {
            private boolean invoked = false;

            @Override
            public void lifecycleEvent(LifecycleEvent event) {
                if (!invoked) {
                    StandardJarScanner scanner = new StandardJarScanner();
                    scanner.setScanClassPath(false);
                    scanner.setScanManifest(false);
                    ((Context) event.getLifecycle()).setJarScanner(scanner);
                    invoked = true;
                }
                super.lifecycleEvent(event);
            }
        };
        Context ctx = tomcat.addWebapp(tomcat.getHost(), "/", "path/to/war", contextConfig);
fcipmucu

fcipmucu3#

其他两个答案不适用于tomcat8.5+。addwebapp将contextconfig作为字符串。但您可以使用下面的代码来进行选择性扫描。请注意,如果jarscanner是在context.xml中定义的,那么它将优先于代码。一旦您调用tomcat.start()

Context context = tomcat.addWebapp("/"+sApp, location);
            //Keep in mind that this JarScanFilter will be overwritten by JarScanner that defined in META-INF\context.xml
            JarScanFilter jarScanFilter = new JarScanFilter() {

                @Override
                public boolean check(JarScanType jarScanType, String jarName) {

                    if(jarName.startsWith("spring")) {
                        System.out.println("JarScanType: "+ jarScanType +" JarName: "+ jarName + " Will Scan: true");
                        return true;
                    }
                    System.out.println("JarScanType: "+ jarScanType +" JarName: "+ jarName + " Will Scan: false");
                    return false;
                }
            };
            context.getJarScanner().setJarScanFilter(jarScanFilter);

相关问题