`
wym0291
  • 浏览: 18959 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Tomcat6.0.18学习笔记_bootstrap.jar

阅读更多

Tomcat6.0.18的bin目录下有一个bootstrap.jar文件,而这个jar中的内容在lib目录下的catalina.jar文件中也存在。为什么要把同样的class放在2个不同的jar中,而且还单独提取出来放到bin目录下?

 

从源码中可以看到,Tomcat6.0.18使用common ClassLoader加载lib目录下的jar,但执行启动脚本时,是把bin目录下的bootstrap.jar设置到-classpath中,然后执行MAINCLASS=org.apache.catalina.startup.Bootstrap。此时,是使用System ClassLoader来加载的Bootstrap.class。如果不单独提取出bootstrap.jar,而是将catalina.jar设置到-classpath中,这时catalina.jar中的所有class将会被System ClassLoader加载。

 

如果是后者就会出现问题了,catalina.jar中的类使用了通过common ClassLoader加载的lib目录下的jar中的class,而此时catalina.jar却是被System ClassLoader加载,默认的双亲委派会导致加载器的向上委托加载,导致catalina.jar中的class找不到common ClassLoader加载的class。

 

如果单独将bootstrap.jar提取出来,设置到-classpath中则就不会出现上述问题。而将bootstrap.jar放置到bin目录下,还有另外的用途,在源码中可以看到:

File bootstrapJar =
            new File(System.getProperty("user.dir"), "bootstrap.jar ");
        if (bootstrapJar.exists() ) {
            try {
                System.setProperty
                    ("catalina.home",
                     (new File(System.getProperty("user.dir"), ".."))
                     .getCanonicalPath());
            } catch (Exception e) {
                // Ignore
                System.setProperty("catalina.home",
                                   System.getProperty("user.dir"));
            }
        } else {
            System.setProperty("catalina.home",
                               System.getProperty("user.dir"));
        }

分享到:
评论
2 楼 opmic 2010-12-03  
楼上
从原文件中看出,tomcat也是先执行楼主那段代码的.
1 楼 wang_hj 2010-09-25  
这段代码应该是没用的,因为tomcat6提供了如下的两个静态方法:
[code="java
    public static String getCatalinaHome() {
        return System.getProperty("catalina.home",
                                  System.getProperty("user.dir"));
    }

    public static String getCatalinaBase() {
        return System.getProperty("catalina.base", getCatalinaHome());
    }

相关推荐

Global site tag (gtag.js) - Google Analytics