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