啓動Tomcat的時候,常常見到這樣的BUG:html
14-Apr-2019 13:53:25.198 信息 [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
之前不知道怎麼處理,怎麼處理纔是正確的,最近研究了點點Tomcat源碼,也算知其一,知其二,不知其三四五六七了,下面先貼上解決方案:java
解決方案:
catalina-home/conf/Catalina.properties中有這樣一個屬性:jarsToSkipweb
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\ annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,\ catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-storeconfig.jar,\ catalina-tribes.jar,\ jasper.jar,jasper-el.jar,ecj-*.jar,\ tomcat-api.jar,tomcat-util.jar,tomcat-util-scan.jar,tomcat-coyote.jar,\ tomcat-dbcp.jar,tomcat-jni.jar,tomcat-websocket.jar,\ tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\ tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,\ tomcat-jdbc.jar,\ tools.jar,\ commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,\ commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,\ commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,\ commons-math*.jar,commons-pool*.jar,\ jstl.jar,taglibs-standard-spec-*.jar,\ geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,\ ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,\ jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,\ xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\ junit.jar,junit-*.jar,ant-launcher.jar,\ cobertura-*.jar,asm-*.jar,dom4j-*.jar,icu4j-*.jar,jaxen-*.jar,jdom-*.jar,\ jetty-*.jar,oro-*.jar,servlet-api-*.jar,tagsoup-*.jar,xmlParserAPIs-*.jar,\ xom-*.jar
咱們只須要將上面的屬性改爲:正則表達式
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=
*
.jar
再次啓動Tomcat,查看容器啓動時候效果:發現果真沒有了以前的那個提示信息.apache
![image image](http://static.javashuo.com/static/loading.gif)
Why?
這個提示信息取消掉它出現,這是其一解決方案,其二呢?這樣作會帶來什麼效果bootstrap
可能JSP後端的動態渲染技術必定程度上會影響響應速度,若是jar包中沒有tld,沒有自定義tld等標籤的話,咱們能夠放心使用上述方式。上述方式原理呢下面簡單記錄下:後端
解析上述tld代碼方法位於:TldScanner#scanJars.api
解析方式會按照tomcat
![image image](http://static.javashuo.com/static/loading.gif)
解釋說明: 會掃描該項目全部加載到的jar包,包括jre/lib下的包,遍歷每一個jar檢測是否有tld,而Catalina.properties配置中的兩個jarsToSkip和jarsToScan做用呢?websocket
check方法中tldSkipSet就是取的jarsToSkip的值,tldScanSet取的就是jarsToSkip的值;tldSkipSet經過正則表達式匹配當前check的jar包,全部的jar都會匹配上*.jar,可是tldScanSet就不必定能夠匹配上,Catalina.properties中jarsToScan都是日誌相關的jar包,沒法和當前正在校驗的jar包正則匹配上,全部這個jar包Tomcat不會作任何掃描處理。上述方法在必定程度上提升了Tomcat啓動速度,若是在當前項目加載jar包特別多的狀況下提高應該明顯。
public boolean check(JarScanType jarScanType, String jarName) {
Lock readLock = configurationLock.readLock();
readLock.lock();
try {
final boolean defaultScan;
final Set<String> toSkip;
final Set<String> toScan;
switch (jarScanType) {
case TLD: {
defaultScan = defaultTldScan;
toSkip = tldSkipSet;
toScan = tldScanSet;
break;
}
case PLUGGABILITY: {
defaultScan = defaultPluggabilityScan;
toSkip = pluggabilitySkipSet;
toScan = pluggabilityScanSet;
break;
}
case OTHER:
default: {
defaultScan = true;
toSkip = defaultSkipSet;
toScan = defaultScanSet;
}
}
if (defaultScan) {
if (Matcher.matchName(toSkip, jarName)) {
if (Matcher.matchName(toScan, jarName)) {
return true;
} else {
return false;
}
}
return true;
} else {
if (Matcher.matchName(toScan, jarName)) {
if (Matcher.matchName(toSkip, jarName)) {
return false;
} else {
return true;
}
}
return false;
}
} finally {
readLock.unlock();
}
}
How?
假如當前狀況下使用到的jar包中有使用tld文件,咱們又不想所有掃描全部jar,而且不想看到上述信息At least one JAR 出現,解決方案是:
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar
tomcat.util.scan.StandardJarScanFilter.jarsToScan=yourjarFile.jar
總結
經過修改Catalina.properties能夠提升程序啓動速度,若是有使用到tld文件,再配置比較合適。