Tomcat啓動log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLD各種解決方式

問題:

啓動tomcat時,catalina.out日誌打印到如下內容就停止不動了,也不報錯

SEVERE: FarmWarDeployer can only work as host cluster subelement!
Dec 02, 2016 4:27:39 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /app/apache-tomcat-7.0.73/webapps/ROOT.war
Dec 02, 2016 4:27:43 PM org.apache.catalina.startup.TldConfig execute
INFO: 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.

根本原因是Jar包檢查TLD標籤沒有通過,解決辦法是刪除 conf/catalina.properties中的部分內容

org.apache.catalina.startup.TldConfig.jarsToSkip=XXX.jar,XXXX.jar

修改爲如下:

org.apache.catalina.startup.TldConfig.jarsToSkip=

具體處理步驟:

1.調整Tomcat對應類的log級別

修改${tomcat}/conf/log4j.properties

##解除類org.apache.jasper.compiler.TldLocationsCache的log  
org.apache.jasper.compiler.TldLocationsCache.level = FINE  
2.觀察Tomcat日誌打印信息

步驟1執行完後,重啓Tomcat,觀察Tomcat日誌,會在日誌中發現類似如下打印信息:

九月 09, 2013 10:55:37 上午 org.apache.jasper.compiler.TldLocationsCache tldScanJar  
詳細: No TLD files were found in [file:/E:/devspace/xxt_login/WEB-INF/lib/json-lib-2.3-jdk15.jar]. Consider adding the JAR to the tomcat.util.scan.DefaultJarScanner.jarsToSkip or org.apache.catalina.startup.TldConfig.jarsToSkip property in CATALINA_BASE/conf/catalina.properties file.  
九月 09, 2013 10:55:37 上午 org.apache.jasper.compiler.TldLocationsCache tldScanJar  
詳細: No TLD files were found in [file:/E:/devspace/xxt_login/WEB-INF/lib/poi-3.8.jar]. Consider adding the JAR to the tomcat.util.scan.DefaultJarScanner.jarsToSkip or org.apache.catalina.startup.TldConfig.jarsToSkip property in CATALINA_BASE/conf/catalina.properties file.  
3.調整${tomcat}/conf/catalina.properties,將提示的jar添加到不掃描清單中
tomcat.util.scan.DefaultJarScanner.jarsToSkip=\  
bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\  
annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,\  
catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,\  
jasper.jar,jasper-el.jar,ecj-*.jar,\  
tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar,tomcat-dbcp.jar,\  
tomcat-jni.jar,tomcat-spdy.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,\  
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,\  
json-lib-*.jar,poi-*.jar  

【注意】

1.如果使用eclipse server插件、Sysdeo tomcat插件啓動Tomcat,此配合可能無效

2.步驟1調整完後,最好清除下以下兩個文件夾𝑡𝑜𝑚𝑐𝑎𝑡/𝑐𝑜𝑛𝑓/𝐶𝑎𝑡𝑎𝑙𝑖𝑛𝑎{tomcat}/work/Catalina

3.儘量使用*號實現模式匹配,以避免因jar版本升級帶來的重複修改代價

原因

Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產生安全隨機類SecureRandom的實例作爲會話ID,這裏花去了342秒,也即接近6分鐘。

SHA1PRNG算法是基於SHA-1算法實現且保密性較強的僞隨機數生成器。

在SHA1PRNG中,有一個種子產生器,它根據配置執行各種操作。

1)如果java.security.egd屬性或securerandom.source屬性指定的是”file:/dev/random”或”file:/dev/urandom”,那麼JVM會使用本地種子產生器NativeSeedGenerator,它會調用super()方法,即調用SeedGenerator.URLSeedGenerator(/dev/random)方法進行初始化。

2)如果java.security.egd屬性或securerandom.source屬性指定的是其它已存在的URL,那麼會調用SeedGenerator.URLSeedGenerator(url)方法進行初始化。

這就是爲什麼我們設置值爲”file:///dev/urandom”或者值爲”file:/./dev/random”都會起作用的原因。

在這個實現中,產生器會評估熵池(entropy pool)中的噪聲數量。隨機數是從熵池中進行創建的。當讀操作時,/dev/random設備會只返回熵池中噪聲的隨機字節。/dev/random非常適合那些需要非常高質量隨機性的場景,比如一次性的支付或生成密鑰的場景。

當熵池爲空時,來自/dev/random的讀操作將被阻塞,直到熵池收集到足夠的環境噪聲數據。這麼做的目的是成爲一個密碼安全的僞隨機數發生器,熵池要有儘可能大的輸出。對於生成高質量的加密密鑰或者是需要長期保護的場景,一定要這麼做。

那麼什麼是環境噪聲?

隨機數產生器會手機來自設備驅動器和其它源的環境噪聲數據,並放入熵池中。產生器會評估熵池中的噪聲數據的數量。當熵池爲空時,這個噪聲數據的收集是比較花時間的。這就意味着,Tomcat在生產環境中使用熵池時,會被阻塞較長的時間。

解決

有兩種解決辦法:

1)在Tomcat環境中解決

可以通過配置JRE使用非阻塞的Entropy Source。

在catalina.sh中加入這麼一行:-Djava.security.egd=file:/dev/./urandom 即可。

加入後再啓動Tomcat,整個啓動耗時下降到Server startup in 2912 ms。

2)在JVM環境中解決

打開$JAVA_PATH/jre/lib/security/java.security這個文件,找到下面的內容:

securerandom.source=file:/dev/urandom

替換成

securerandom.source=file:/dev/./urandom

第一種: 嚴格遵守java規範,修改對象的屬性名稱,要求不包含java關鍵字;
第二種: 修改EL表達式,例如"𝑜𝑤𝑛𝑒𝑟.𝑛𝑒𝑤"可以修改爲"{owner[‘new’]}";
第三種: 修改tomcat屬性,忽略對EL表達式的關鍵字檢查。修改$CATALINA_BASE/conf/catalina.properties文件,添加org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true選項。
第四種: 參照:http://blog.csdn.net/yasi_xi/article/details/49642661關於這個的處理

通過上面五種方式處理過後還是報同樣的錯誤,就開始嘗試替換tomcat版本。也嘗試更換tomcat的默認目錄,也考慮過項目在打包成war之前項目是不是有斷點。這些排除之後還是一樣報錯。到這裏幾乎已經快放棄了。但是後來想了想有沒有可能是數據庫的問題呢?(經過驗證就是數據庫的問題)

The last packet sent successfully to the server was 0 milliseconds
ago. The driver has not received

最後問題解決

其實就是一個數據庫的映射端口的問題,Linux服務器將3306的端口對外映射成了13306,而我的數據庫連接URL中還是用的這個13306這個端口。項目部署到Linux服務器後這個端口應該改成3306即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章