先大致看一下外部启动一个Jetty服务器的过程,然后再展开分析
1.java start.jar进行启动,解析命令行参数并读取start.ini中配置的所有参数。
2.解析start.config确定jetty模块的类路径并确定首先执行的MainClass。
3.可以选择是否另起一个进程来,如果不另起进程,则通过反射方式来调用MainClass,start.ini中配置的JVM参数不会生效。
4.MainClass默认是XmlConfiguration,解析etc/jetty.xml,etc/jetty-deploy.xml等,创建实例并组装Server(是根据在start.ini中定义的顺序创建,顺序很重要,这里的IOC是jetty自己实现的)然后调用start()启动Server()。
1.start.jar启动分析
我们可以通过java -jar start.jar 命令来启动jetty,所以首先从start.jar开始分析。这个jar中包含了解析命令行参数的Main类,Main主要负责解析命令行中传入的参数以及start.ini文件中配置的参数。start.ini 中定义了 JVM 需要的参数以及 etc 目录中用到的xml配置文件和启动jetty启动时需要加载的模块,如下图:
然后由Config类解析出start.ini中OPTIONS选项指定的模块包位置并加入到classpath中,这些模块包都定义在在start.config文件中,通过在 start.ini 中定义 OPTIONS 以及在 start.config 中定义模块路径就可以确定把哪些 jar 加入到环境变量中。
以上准备工作做完之后就可以真正开始服务器处理了,这时候可以在本进程中直接通过反射方式启动,但缺点是start.ini中配置的JVM参数就如同虚设了,
因为Java进程已经起来了,不能再按照新的堆参数进行设置了;第二种方式就是重新启动一个进程,这样就可以重新设置堆参数了,start.ini 中得到了启动参数start.config 中有了MainClass和Classpath需要的jar包,则可以直接用java xxx方式启动了,要使用这种方式启动只需要在 start.ini 中配置 –exec 参数即可。
这里的MainClass默认是XmlConfiguration类,它默认做几件事情:1.对start.ini中定义的配置文件进行解析,例如/etc/jetty.xml等。2.通过自己的IO