`

tomcat 源码研究之自定义应用工程jar包加载路径

 
阅读更多

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>

 而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的加载

 

分享到:
评论

相关推荐

    运行apache-tomcat-7.0.81源码所需的jar包和新建eclipse工程步骤

    4. 将Tomcat源码目录添加到项目中:右键点击项目,选择“Import” -&gt; “Existing Projects into Workspace”,然后选择源码所在的目录。 5. 确保源码被正确导入,没有错误或警告。如果有,可能是因为缺少依赖的jar包...

    Eclipse导入TOMCAT7源码所需jar包

    为了在Eclipse中导入和编译Tomcat源码,我们需要设置合适的构建路径,这通常包括添加必要的库和JAR依赖。 3. **Ant**:Ant是Apache的构建工具,类似于Java世界的Makefile。在导入Tomcat源码时,Ant的配置文件...

    tomcat7.070 源码及转成eclipse

    2. **构建路径设置**:由于Tomcat源码依赖于许多外部库,你需要配置项目的构建路径。在项目属性中设置`Java Build Path`,添加所需的JAR文件,如`servlet-api.jar`、`jsp-api.jar`等。 3. **项目重构**:为了更好地...

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于...通过阅读和研究Tomcat源码,我们可以更深入地了解这一机制,从而更好地驾驭这个强大的Web服务器。

    java类加载器-tomcat中的类加载器

    Tomcat,作为广泛使用的Java Servlet容器,它自定义了一套类加载机制,以满足Web应用程序的特殊需求。下面我们将深入探讨Java类加载器以及Tomcat中的类加载器。 在Java中,类加载器主要分为三个层次:Bootstrap ...

    servlet api 源码jar包 Mac版

    - **导入jar包**:将`servlet-api-2.5-6.1h.6-sources.jar`添加到Eclipse项目的构建路径中,这样可以在开发环境中获得源码支持,方便阅读和调试。 - **配置Tomcat服务器**:确保已安装并配置了支持Servlet 2.5的...

    tomcat加载jar异常问题的分析与解决

    通常情况下,Tomcat服务器会自动将应用的WEB-INF/lib目录下的所有JAR包加载到类路径中。如果使用了maven-war-plugin插件,需要在pom.xml中正确配置,以便将依赖包包含在生成的WAR文件中。 3. 如果项目中使用了...

    tomcat6.0源码,可直接导入eclipse运行

    通过阅读和分析源码,你可以了解Tomcat如何加载web应用程序,如何处理请求,以及如何管理线程池和连接器。同时,也可以深入研究JSP编译过程、会话管理、安全性和性能优化等方面。 对于Eclipse用户,利用其强大的...

    tomcat原代码下载

    通过研究Tomcat的源代码,我们可以理解其工作原理,提升Java Web开发技能,并为自定义配置或优化性能提供基础。” 【知识详情】: Tomcat,由Apache软件基金会开发,是一款广泛使用的开源Java Servlet容器。它实现...

    分jar包资料

    Tomcat提供了`-J`参数来指定包含预编译JSP的jar包,这样启动时会直接加载这些预编译的Servlet,而不是在首次请求时才编译。这个过程涉及到JSP生命周期和Tomcat的配置。 最后,"servlet过滤器 - phpzxh - 博客园"这...

    spring的jar包源码

    以下是对标题"spring的jar包源码"和描述"spring的jar包源码"中涉及的知识点的详细说明: 1. **Spring框架核心(spring-core)**: - `spring-core`是Spring框架的基础,包含了资源加载、对象创建、类型转换等关键...

    邮件开发:javaee.jar mail.jar开发包与javaEE5.0冲突

    这个jar文件通常包含在应用服务器(如Tomcat、Glassfish或JBoss)的类路径中,为开发者提供了一整套开发企业级应用的接口和类。然而,它并不直接包含JavaMail相关的API,这部分功能是由`mail.jar`提供的。 `mail....

    Tomcat 5.0.18 ClassLoader source code insight

    此外,Tomcat的ClassLoader还引入了"负类路径"的概念,即通过`negatedClassPath`来指定不希望被加载的类或包,这有助于避免类冲突问题。 在深入理解Tomcat ClassLoader源码的过程中,我们还可以关注其对线程安全的...

    Tomcat工作原理祥解

    5. **Shared**: 仅对Web应用程序可见,不包括Tomcat,加载`$CATALINA_HOME/shared`和`$CATALINA_HOME/lib`目录。 6. **WebApp**: 对应每个Web应用,加载`/WEB-INF/classes`和`/WEB-INF/lib/*.jar`。 类加载顺序:...

    tomcat启动和关闭

    深入理解Tomcat源码可以帮助开发者了解其内部工作原理,例如请求处理流程、线程模型、类加载机制等。这对于优化性能、调试问题或定制服务器功能非常有帮助。 工具方面,除了上述的启动和关闭脚本,还有其他管理和...

    【kettle】10分钟搞定kettle源码部署

    - 添加所有JAR包到项目的构建路径中。 ##### 6. 导入JAR包 - 选中`lib`文件夹下的所有JAR包,但排除`kettle-core.xxx.jar`、`kettle-bddialog.xxx.jar`、`kettle-engine.xxx.jar`这三个。 - 通过右键菜单选择`Build...

    SpringBoot 类加载过程,源码分析

    Spring Boot使用自定义的`LaunchedURLClassLoader`作为应用程序的主要类加载器。这个类加载器扩展了标准的`URLClassLoader`,并添加了对Spring Boot特定功能的支持,如从JAR内部加载类和资源。 5. **启动主类**: ...

    Spring EntityManager 不能扫描jar 中的class文件

    4. **容器配置**:如果你的项目是在应用服务器(如Tomcat)中运行,你还可以考虑调整服务器的类加载策略,使其能够正确加载jar中的类。这通常涉及对`WEB-INF/lib`目录下jar包的处理方式。 5. **Maven或Gradle插件**...

    springboot学习源码

    SpringBoot会根据类路径中的jar包和配置文件内容,自动配置相应的Bean。 在SpringBoot的源码中,`META-INF/spring.factories`文件起着至关重要的作用。这个文件列出了所有可用的自动配置类和starter模块。当我们...

    springboot源码思维导图

    3. 嵌入式服务器:SpringBoot可以内嵌Tomcat、Jetty等Web服务器,使得无需打包成WAR文件,直接运行JAR就能启动服务。 二、SpringBoot工作原理 1. 初始化过程:SpringBoot应用启动时,会加载主配置类,然后通过`...

Global site tag (gtag.js) - Google Analytics