Tomcat在啟動是提示:
INFO [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.
引言:
今天在linux使用tomcat+war包方式部署項目的時候,發現tomcat啟動時,會卡住一段時間,接近4分鍾左右。這對擁有小暴脾氣的我肯定沒法接受,網上也有很多的解決方案,一一嘗試沒一個有用,經過各種FQ查閱資料,終於找到解決方案,特此記錄下
現象:
- 觀察啟動日志可看到如下警告日志:
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
- 這段日志的原因是:
1:Tomcat啟動時會掃描大量jar包,如果含有不符合TLD規范的就會出現這個問題
2:以后基本上不會使用JSP作為視圖層,所以我們可能根本不需要TLD這個東西,就算不要TLD也沒有什么關系
解決辦法:
1:查找tomcat/conf/catalina.properties 修改tomcat.util.scan.StandardJarScanFilter.jarsToSkip=的值為*.jar
這段配置代表tomcat在啟動時,跳過所有的jar掃描。但是本人親測並沒有作用
2:修改jre隨機種子的生成規則。
- 原因:Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產生安全隨機類SecureRandom的實例作為會話ID,我這兒花了300多S
- 產生器會評估熵池(entropy pool)中的噪聲數量。隨機數是從熵池中進行創建的。當讀操作時,/dev/random設備會只返回熵池中噪聲的隨機字節。/dev/random非常適合那些需要非常高質量隨機性的場景,比如一次性的支付或生成密鑰的場景。
當熵池為空時,來自/dev/random的讀操作將被阻塞,直到熵池收集到足夠的環境噪聲數據。這么做的目的是成為一個密碼安全的偽隨機數發生器,熵池要有盡可能大的輸出。對於生成高質量的加密密鑰或者是需要長期保護的場景,一定要這么做。
最終解決辦法
- 在Tomcat環境中解決 可以通過配置JRE使用非阻塞的Entropy Source。
在$TOMCAT_HOME/conf/catalina.sh中加入:-Djava.security.egd=file:/dev/./urandom 即可。
- 在JVM環境中解決
打開$JAVA_HOME/jre/lib/security/java.security這個文件,將securerandom.source的值修改為file:/dev/./urandom
END:
使用這種方案后,啟動速度從300多S下降至10S