我将tomcat 7.0.32嵌入在水槽源中。我遇到的问题是Flume将大量的东西放在同类路径上,而在启动时,Tomcat扫描了寻找TLDS的类Path,这引起了问题,因为Flume使用了通配符。
信息:启动servlet Engine:apache tomcat/7.0.3211月5日,2012年11月8:21:08 AM org.apache.catalina.startup.tldconfig tldscanjar警告:无法处理jar [jar:file:/opt/mapr/hadoop/hadoop-0.20.2/hadoop* coreh.jar!/] for TLD文件java.io.filenotfoundexception:/opt/mapr/hadoop/hadoop-0.20.2/hadoop* coreh.jar(没有此类文件或目录) 在java.util.zip.zipfile.open(本机方法) 在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.jarurlconnection.connect(jarurlConnection.java:122) 在sun.net.www.protocol.jar.jarurlconnection.getjarfile(jarurlConnection.java:89) atrg.apache.tomcat.util.scan.fileurljar。(fileurljar.java:41) atrg.apache.tomcat.util.scan.jarfactory.newinstance(jarfactory.java:34) atorg.apache.catalina.startup.tldconfig.tldscanjar(tldconfig.java:487) at org.apache.catalina.startup.tldconfig.access $ 100(tldconfig.java:58) atrg.apache.catalina.startup.tldconfig $ tldjarscannercallback.scan(tldconfig.java:303) 在org.apache.tomcat.util.scan.standjarscanner.process(StandardJarscanner.java:241) atrg.apache.tomcat.util.scan.standardjarscanner.scan(standardjarscanner.java:204) atorg.apache.catalina.startup.tldconfig.execute(tldconfig.java:277)
在我的代码中,我试图禁用此扫描,甚至尝试将jarscanner设置为在我的上下文中。这无济于事。以下是我的代码:
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() {
尝试这个! 上下文= tomcat.addwebapp("/d"," d:/"); Jarscanner Jarscanner = New Jarscanner() {
@Override
public void scan(ServletContext arg0, ClassLoader arg1,
JarScannerCallback arg2, Set<String> arg3)
{
//do nothing
}
};
context.setJarScanner(jarScanner);
yo可以在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);
其他两个答案不适用于tomcat 8.5 。AddWebapp将ContextConfig作为字符串。但是您可以使用下面的代码进行选择性扫描。请注意,如果在上下文中定义了jarscanner。xml将优先于代码。一旦您致电Tomcat.start()
,Jarscanfilter将被回电 Context context = tomcat.addWebapp("/"+sApp, location);
//Keep in mind that this JarScanFilter will be overwritten by JarScanner that defined in META-INFcontext.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);