tomcat 启动应用工程的时候,它会加载应用工程中的jar包,而一般情况这些jar包默认放在WEB-INF/lib路径下,那么我们可以不可以指定额外的路径去加载应用工程中所需的jar包呢,这点我明确的告诉你是可以的,而且tomcat给我们预留了扩展 ,具体怎么做请看下面
我们需要在Context.xml中配置
<Context docBase="\webapps\mydocbase">
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/dir/classes;/somedir/somejar.jar;
/somedir/*.jar"/>
</Context>
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/dir/classes;/somedir/somejar.jar;
/somedir/*.jar"/>
</Context>
而Context.xml 怎么存放在应用工程的META-INF/context.xml,其实就是在Context节点中配置一个Loader节点
loader节点中className就是解析映射这个Loader的类,virtualclasspath这个属性就是jar包所存放的路径
这里加载的jar包会跟默认路径WEB-INF/lib下的jar一样
下面请看
public class VirtualWebappLoader extends WebappLoader { private static final org.apache.juli.logging.Log log= org.apache.juli.logging.LogFactory.getLog( VirtualWebappLoader.class ); /** * <code>;</code> separated list of additional path elements. */ private String virtualClasspath = ""; /** * Construct a new WebappLoader with no defined parent class loader (so that * the actual parent will be the system class loader). */ public VirtualWebappLoader() { super(); } /** * Construct a new WebappLoader with the specified class loader to be * defined as the parent of the ClassLoader we ultimately create. * * @param parent The parent class loader */ public VirtualWebappLoader(ClassLoader parent) { super(parent); } /** * <code>virtualClasspath</code> attribute that will be automatically set * from the <code>Context</code> <code>virtualClasspath</code> attribute * from the context xml file. * @param path <code>;</code> separated list of path elements. */ public void setVirtualClasspath(String path) { virtualClasspath = path; } /** * @return Returns searchVirtualFirst. */ public boolean getSearchVirtualFirst() { return getSearchExternalFirst(); } /** * @param searchVirtualFirst Whether the virtual class path should be searched before the webapp */ public void setSearchVirtualFirst(boolean searchVirtualFirst) { setSearchExternalFirst(searchVirtualFirst); } /** * Implement the requirements * of {@link org.apache.catalina.util.LifecycleBase#startInternal()}. * * @exception LifecycleException if this component detects a fatal error * that prevents this component from being used */ @Override protected void startInternal() throws LifecycleException { // just add any jar/directory set in virtual classpath to the // repositories list before calling start on the standard WebappLoader StringTokenizer tkn = new StringTokenizer(virtualClasspath, ";"); Set<String> set = new LinkedHashSet<String>(); while (tkn.hasMoreTokens()) { String token = tkn.nextToken().trim(); if (token.isEmpty()) { continue; } if (log.isDebugEnabled()) log.debug(sm.getString("virtualWebappLoader.token", token)); if (token.endsWith("*.jar")) { // glob token = token.substring(0, token.length() - "*.jar".length()); File directory = new File(token); if (!directory.isDirectory()) { if (log.isDebugEnabled()) { log.debug(sm.getString( "virtualWebappLoader.token.notDirectory", directory.getAbsolutePath())); } continue; } if (log.isDebugEnabled()) { log.debug(sm.getString( "virtualWebappLoader.token.glob.dir", directory.getAbsolutePath())); } String filenames[] = directory.list(); Arrays.sort(filenames); for (int j = 0; j < filenames.length; j++) { String filename = filenames[j].toLowerCase(Locale.ENGLISH); if (!filename.endsWith(".jar")) continue; File file = new File(directory, filenames[j]); if (!file.isFile()) { if (log.isDebugEnabled()) { log.debug(sm.getString( "virtualWebappLoader.token.notFile", file.getAbsolutePath())); } continue; } if (log.isDebugEnabled()) { log.debug(sm.getString( "virtualWebappLoader.token.file", file.getAbsolutePath())); } set.add(file.toURI().toString()); } } else { // single file or directory File file = new File(token); if (!file.exists()) { if (log.isDebugEnabled()) { log.debug(sm.getString( "virtualWebappLoader.token.notExists", file.getAbsolutePath())); } continue; } if (log.isDebugEnabled()) { log.debug(sm.getString( "virtualWebappLoader.token.file", file.getAbsolutePath())); } set.add(file.toURI().toString()); } } for (String repository: set) { addRepository(repository); } super.startInternal(); } }
从这个类我们可以知道他其实继承的是WebappLoader这个类,而这个WebappLoader类其实就是整个tomcat中加载jar class等文件的类,
而他的startInternal方法恰巧表明他在,启动过程中就会帮我处理好额外jar的加载
相关推荐
4. 将Tomcat源码目录添加到项目中:右键点击项目,选择“Import” -> “Existing Projects into Workspace”,然后选择源码所在的目录。 5. 确保源码被正确导入,没有错误或警告。如果有,可能是因为缺少依赖的jar包...
为了在Eclipse中导入和编译Tomcat源码,我们需要设置合适的构建路径,这通常包括添加必要的库和JAR依赖。 3. **Ant**:Ant是Apache的构建工具,类似于Java世界的Makefile。在导入Tomcat源码时,Ant的配置文件...
2. **构建路径设置**:由于Tomcat源码依赖于许多外部库,你需要配置项目的构建路径。在项目属性中设置`Java Build Path`,添加所需的JAR文件,如`servlet-api.jar`、`jsp-api.jar`等。 3. **项目重构**:为了更好地...
《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于...通过阅读和研究Tomcat源码,我们可以更深入地了解这一机制,从而更好地驾驭这个强大的Web服务器。
Tomcat,作为广泛使用的Java Servlet容器,它自定义了一套类加载机制,以满足Web应用程序的特殊需求。下面我们将深入探讨Java类加载器以及Tomcat中的类加载器。 在Java中,类加载器主要分为三个层次:Bootstrap ...
- **导入jar包**:将`servlet-api-2.5-6.1h.6-sources.jar`添加到Eclipse项目的构建路径中,这样可以在开发环境中获得源码支持,方便阅读和调试。 - **配置Tomcat服务器**:确保已安装并配置了支持Servlet 2.5的...
通常情况下,Tomcat服务器会自动将应用的WEB-INF/lib目录下的所有JAR包加载到类路径中。如果使用了maven-war-plugin插件,需要在pom.xml中正确配置,以便将依赖包包含在生成的WAR文件中。 3. 如果项目中使用了...
通过阅读和分析源码,你可以了解Tomcat如何加载web应用程序,如何处理请求,以及如何管理线程池和连接器。同时,也可以深入研究JSP编译过程、会话管理、安全性和性能优化等方面。 对于Eclipse用户,利用其强大的...
通过研究Tomcat的源代码,我们可以理解其工作原理,提升Java Web开发技能,并为自定义配置或优化性能提供基础。” 【知识详情】: Tomcat,由Apache软件基金会开发,是一款广泛使用的开源Java Servlet容器。它实现...
Tomcat提供了`-J`参数来指定包含预编译JSP的jar包,这样启动时会直接加载这些预编译的Servlet,而不是在首次请求时才编译。这个过程涉及到JSP生命周期和Tomcat的配置。 最后,"servlet过滤器 - phpzxh - 博客园"这...
以下是对标题"spring的jar包源码"和描述"spring的jar包源码"中涉及的知识点的详细说明: 1. **Spring框架核心(spring-core)**: - `spring-core`是Spring框架的基础,包含了资源加载、对象创建、类型转换等关键...
- 添加所有JAR包到项目的构建路径中。 ##### 6. 导入JAR包 - 选中`lib`文件夹下的所有JAR包,但排除`kettle-core.xxx.jar`、`kettle-bddialog.xxx.jar`、`kettle-engine.xxx.jar`这三个。 - 通过右键菜单选择`Build...
这个jar文件通常包含在应用服务器(如Tomcat、Glassfish或JBoss)的类路径中,为开发者提供了一整套开发企业级应用的接口和类。然而,它并不直接包含JavaMail相关的API,这部分功能是由`mail.jar`提供的。 `mail....
此外,Tomcat的ClassLoader还引入了"负类路径"的概念,即通过`negatedClassPath`来指定不希望被加载的类或包,这有助于避免类冲突问题。 在深入理解Tomcat ClassLoader源码的过程中,我们还可以关注其对线程安全的...
5. **Shared**: 仅对Web应用程序可见,不包括Tomcat,加载`$CATALINA_HOME/shared`和`$CATALINA_HOME/lib`目录。 6. **WebApp**: 对应每个Web应用,加载`/WEB-INF/classes`和`/WEB-INF/lib/*.jar`。 类加载顺序:...
深入理解Tomcat源码可以帮助开发者了解其内部工作原理,例如请求处理流程、线程模型、类加载机制等。这对于优化性能、调试问题或定制服务器功能非常有帮助。 工具方面,除了上述的启动和关闭脚本,还有其他管理和...
Spring Boot使用自定义的`LaunchedURLClassLoader`作为应用程序的主要类加载器。这个类加载器扩展了标准的`URLClassLoader`,并添加了对Spring Boot特定功能的支持,如从JAR内部加载类和资源。 5. **启动主类**: ...
4. **容器配置**:如果你的项目是在应用服务器(如Tomcat)中运行,你还可以考虑调整服务器的类加载策略,使其能够正确加载jar中的类。这通常涉及对`WEB-INF/lib`目录下jar包的处理方式。 5. **Maven或Gradle插件**...
SpringBoot会根据类路径中的jar包和配置文件内容,自动配置相应的Bean。 在SpringBoot的源码中,`META-INF/spring.factories`文件起着至关重要的作用。这个文件列出了所有可用的自动配置类和starter模块。当我们...
3. 嵌入式服务器:SpringBoot可以内嵌Tomcat、Jetty等Web服务器,使得无需打包成WAR文件,直接运行JAR就能启动服务。 二、SpringBoot工作原理 1. 初始化过程:SpringBoot应用启动时,会加载主配置类,然后通过`...