啟動Tomcat的時候,經常見到這樣的BUG:
以前不知道怎么處理,怎么處理才是正確的,最近研究了點點Tomcat源碼,也算知其一,知其二,不知其三四五六七了,下面先貼上解決方案:
解決方案:
catalina-home/conf/Catalina.properties中有這樣一個屬性:jarsToSkip
我們只需要將上面的屬性改成:
再次啟動Tomcat,查看容器啟動時候效果:發現果然沒有了之前的那個提示信息.
Why?
這個提示信息取消掉它出現,這是其一解決方案,其二呢?這樣做會帶來什么效果
可能JSP后端的動態渲染技術一定程度上會影響響應速度,如果jar包中沒有tld,沒有自定義tld等標簽的話,我們可以放心使用上述方式。上述方式原理呢下面簡單記錄下:
解析上述tld代碼方法位於:TldScanner#scanJars.
解析方式會按照
解釋說明: 會掃描該項目所有加載到的jar包,包括jre/lib下的包,遍歷每個jar檢測是否有tld,而Catalina.properties配置中的兩個jarsToSkip和jarsToScan作用呢?
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 出現,解決方案是:
總結
通過修改Catalina.properties可以提高程序啟動速度,如果有使用到tld文件,再配置比較合適。


