bootstrap.jar的作用

本文深入探讨了Tomcat6.0.18中bootstrap.jar为何被单独提取并放置于bin目录下,以及其与lib目录下catalina.jar中相同内容的关系。解释了这一设计背后的逻辑,并阐述了将bootstrap.jar设置到-classpath中的必要性,以及这一操作如何避免类加载器冲突问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:点击打开链接


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"));
        }


h-7.17.14.jar:7.17.14] at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) [elasticsearch-cli-7.17.14.jar:7.17.14] at org.elasticsearch.cli.Command.main(Command.java:77) [elasticsearch-cli-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125) [elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) [elasticsearch-7.17.14.jar:7.17.14] [2025-06-26T11:32:15,565][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/kms/component/es/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])? at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:173) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) ~[elasticsearch-cli-7.17.14.jar:7.17.14] at org.elasticsearch.cli.Command.main(Command.java:77) ~[elasticsearch-cli-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-7.17.14.jar:7.17.14] Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/kms/component/es/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])? at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.node.Node.<init>(Node.java:429) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.node.Node.<init>(Node.java:309) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) ~[elasticsearch-7.17.14.jar:7.17.14] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169) ~[elasticsearch-7.17.14.jar:7.17.14]如何解决
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值