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即可。

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