我将 Tomcat 7.0.32 嵌入到 Flume Source 中。我遇到的问题是 Flume 在 Classpath 上放置了很多东西,并且在启动时,Tomcat 会扫描类路径以查找 TLD,这会导致问题,因为 flume 使用了通配符。
信息:启动 Servlet 引擎:Apache Tomcat/7.0.32 Nov 05, 2012 8:21:08 AM org.apache.catalina.startup.TldConfig tldScanJar 警告:无法处理 JAR [jar:file:/opt/mapr/hadoop/ hadoop-0.20.2/hadoop*core*.jar!/] 用于 TLD 文件 java.io.FileNotFoundException: /opt/mapr/hadoop/hadoop-0.20.2/hadoop*core*.jar (没有这样的文件或目录)在 java.util.zip.ZipFile.open(Native Method) 在 java.util.zip.ZipFile.(ZipFile.java:214) 在 java.util.zip.ZipFile.(ZipFile.java:144) 在 java.util .jar.JarFile.(JarFile.java:152) 在 java.util.jar.JarFile.(JarFile.java:89) 在 sun.net.www.protocol.jar.URLJarFile.(URLJarFile.java:93) 在 sun .net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:69) 在 sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:88) 在 sun.net.www.protocol.jar .JarURL 连接。connect(JarURLConnection.java:122) 在 sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:89) 在 org.apache.tomcat.util.scan.FileUrlJar.(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。在 org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:241) 访问 $100(TldConfig.java:58) 在 org.apache.catalina.startup.TldConfig$TldJarScannerCallback.scan(TldConfig.java:303) ) 在 org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:204) 在 org.apache.catalina.startup.TldConfig.execute(TldConfig.java:277)89) 在 org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:34) 在 org.apache.catalina 的 org.apache.tomcat.util.scan.FileUrlJar.(FileUrlJar.java:41)。 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.scan(StandardJarScanner.java:204) 的 org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:241)。 catalina.startup.TldConfig.execute(TldConfig.java:277)89) 在 org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:34) 在 org.apache.catalina 的 org.apache.tomcat.util.scan.FileUrlJar.(FileUrlJar.java:41)。 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.scan(StandardJarScanner.java:204) 的 org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:241)。 catalina.startup.TldConfig.execute(TldConfig.java:277)487) 在 org.apache.catalina.startup.TldConfig$TldJarScannerCallback.scan(TldConfig.java:303) 在 org.apache.tomcat 的 org.apache.catalina.startup.TldConfig.access$100(TldConfig.java:58)。 org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:204) 中的 util.scan.StandardJarScanner.process(StandardJarScanner.java:241) org.apache.catalina.startup.TldConfig.execute(TldConfig.爪哇:277)487) 在 org.apache.catalina.startup.TldConfig$TldJarScannerCallback.scan(TldConfig.java:303) 在 org.apache.tomcat 的 org.apache.catalina.startup.TldConfig.access$100(TldConfig.java:58)。 org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:204) 处的 util.scan.StandardJarScanner.process(StandardJarScanner.java:241) org.apache.catalina.startup.TldConfig.execute(TldConfig.爪哇: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() {