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

Java代碼   收藏代碼
  1. ##解除類org.apache.jasper.compiler.TldLocationsCache的log  
  2. org.apache.jasper.compiler.TldLocationsCache.level = FINE  

 

 2.觀察Tomcat日志打印信息

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

Java代碼   收藏代碼
  1. 九月 09, 2013 10:55:37 上午 org.apache.jasper.compiler.TldLocationsCache tldScanJar  
  2. 詳細: 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.  
  3. 九月 09, 2013 10:55:37 上午 org.apache.jasper.compiler.TldLocationsCache tldScanJar  
  4. 詳細: 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添加到不掃描清單中

Java代碼   收藏代碼
  1. tomcat.util.scan.DefaultJarScanner.jarsToSkip=\  
  2. bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\  
  3. annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,\  
  4. catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,\  
  5. jasper.jar,jasper-el.jar,ecj-*.jar,\  
  6. tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar,tomcat-dbcp.jar,\  
  7. tomcat-jni.jar,tomcat-spdy.jar,\  
  8. tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\  
  9. tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,\  
  10. tomcat-jdbc.jar,\  
  11. tools.jar,\  
  12. commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,\  
  13. commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,\  
  14. commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,\  
  15. commons-math*.jar,commons-pool*.jar,\  
  16. jstl.jar,\  
  17. geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,\  
  18. ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,\  
  19. jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,\  
  20. xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\  
  21. junit.jar,junit-*.jar,ant-launcher.jar,\  
  22. json-lib-*.jar,poi-*.jar  

 

 

【注意】

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

2.步驟1調整完后,最好清除下以下兩個文件夾${tomcat}/conf/Catalina ${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
  • 1
  • 2

替換成

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

 

第一種:嚴格遵守java規范,修改對象的屬性名稱,要求不包含java關鍵字; 
第二種:修改EL表達式,例如"${owner.new}"可以修改為"${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即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM