关闭 Tomcat 的 TLD 扫描的功能 Jan 21st, 2014 | Comments

Tomcat 作为 Servlet 规范的实现者,它在应用启动的时候会扫描 Jar 包里面的 .tld 文件,加载里面定义的标签库,但是,我们在开发的时候很多都不是采用 JSP 作为 Web 页面的模板的,很多都是使用 Velocity 之类的模板引擎,自然而然,为了加快应用的启动速度,我们可以把 Tomcat 里面的这个功能给关掉。

方法 看 Tomcat 的配置文档,关于 Context 的设置这一块,看到了 processTlds 这个属性可以设置,看下这个属性的说明:

Whether the context should process TLDs on startup. The default is true. The false setting is intended for special cases that know in advance TLDs are not part of the webapp. 只要在 Context 中把这个属性设置成 false,那么我们就可以关闭 Tomcat 的 TLD 扫描功能了,为了让所有的应用都可以关闭这个功能,我们可以将 Tomcat 目录下的 conf/context.xml 修改成如下这样:

<?xml version='1.0' encoding='utf-8'?>
<Context processTlds="false">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

但是,在 Tomcat 6 中测试的时候,发现这个功能没有生效,无奈只能 Debug Tomcat 的源码,发现 StandardContext 的 init 方法下有如下代码:

if (processTlds) {
this.addLifecycleListener(new TldConfig());
}

super.init();

// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(INIT_EVENT, null);

这里需要说明的一点是,我们的默认的 context 配置是在 lifecycle.fireLifecycleEvent(INIT_EVENT, null); 这行代码中被处理的,而在这行代码之前,Tomcat 就已经使用了 processTlds,我们的配置完全没有生效。 Workaround 那么,这么解决呢?在 context 中,我们还可以配置一个 JarScanner,这个 JarScanner 会被用来扫描 Jar 包中的 tld 文件,我们可以在默认的 context.xml 中配置一个空的 JarScanner,像下面这样:

<?xml version='1.0' encoding='utf-8'?>
<Context processTlds="false">
<JarScanner className="com.alipay.sofa.runtime.test.patch.tomcat.NullJarScanner"/>
</Context>

NullJarScanner 的代码如下:

package com.alipay.sofa.runtime.test.patch.tomcat;

import org.apache.tomcat.JarScanner;
import org.apache.tomcat.JarScannerCallback;

import javax.servlet.ServletContext;
import java.util.Set;

/**
* @author khotyn 14-1-21 下午4:37
*/
public class NullJarScanner implements JarScanner {
@Override
public void scan(ServletContext context, ClassLoader classloader, JarScannerCallback callback, Set<String> jarsToSkip) {
// Do nothing at all.
}
}

需要注意的是,Tomcat 7 不会出现上述的问题,你只要在配置中把 processTlds 设置成 false 即可。

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

Intellij IDEA 使用Spring-boot-devTools无效解决办法

相信大部分使用Intellij的同学都会遇到这个问题,即使项目使用了spring-boot-devtools,修改了类或者html、js等,idea还是不会自动...

2785
来自专栏cnblogs

Webpack单元测试,e2e测试

此篇文章是续 webpack多入口文件、热更新等体验,主要说明单元测试与e2e测试的基本配置以及相关应用。 一、单元测试 实现单元测试框架的搭建、es6语法的应...

32110
来自专栏WindCoder

Windows 7下硬盘安装Ubuntu 13.10图文教程

之前一直在虚拟机里玩Linux了,昨天忽然兴起想往真机里装一个,昨天找到的方法,今天折腾了半天终于装好啦。

2671
来自专栏后台全栈之路

在 C/C++ 异步 I/O 中使用 MariaDB 的非阻塞接口

对 C/C++,MySQL 提供的库传统上都是阻塞操作,因此适合多线程 / 进程服务器架构编程。但是如果用 C/C++ 编写服务器,往往对性能会有极致要求,此时...

6212
来自专栏企鹅号快讯

通过TCP Wrappers设置ssh源地址过滤策略无法生效的解决办法

Linux系统管理员们应该经常会收到安全管理员们发来的openssh的相关漏洞,这个很常见,危险级别也比较高。通常有两种解决办法:1、升级openssh版本;2...

2687
来自专栏流柯技术学院

CAS客户端服务器端配置步骤

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一...

5352
来自专栏JetpropelledSnake

SNMP学习笔记之Linux下安装和配置SNMP

  选择一个SNMP版本,比如5.7.1,下载地址如下:http://sourceforge.net/projects/net-snmp/files/net-s...

2353
来自专栏酷玩时刻

Android依赖管理与私服搭建

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 *本篇文章视频 慕课网之Android依赖管理与私服搭建

1605
来自专栏FreeBuf

如何在安卓移动终端进行一次渗透实验?

下面的实验将通过使用一个虚拟Android系统作为实验主体来进行展示。在这个实验中,通过使用虚拟Android系统,模拟移动终端的操作,来帮助我们逐步实现使用一...

3236
来自专栏Young Dreamer

webpack的Hot Module Replacement运行机制

使用webpack打包,难免会使用Hot Module Replacement功能,该功能能够实现修改、添加或删除前端页面中的模块代码,而且是在页面不刷新的前提...

2935

扫码关注云+社区

领取腾讯云代金券