启动:
总的流程,start.java根据startup.properties启动ofbiz,然后根据ofbiz-containers.xml启动配置的container,完成启动过程。
Start.java
本身是一个线程,可以接收指令,停止OFbiz,
注意一个用法:setShutDownHook,可以设置线程退出时执行的内容,参考Rumtime.addShutdownHook(Thread hook)
在startServer()中,首先通过Classpath对象,初始化需要使用的lib,构造ClassLoader,然后通过StartupLoader,来启动Server
Config类对应了startup.properties, 然后containerConfig根据ofbiz-containers.xml
org.ofbiz.base.container.ContainerLoader.load()
然后启动,ofbiz-containers.xml中定义的各container,与对应的class,
component-container,org.ofbiz.base.container.ComponentContainer
classloader-container
jotm-container
rmi-dispatcher
jetty-container
beanshell-container
load这些对应的class
1)component-container
ComponentLoaderConfig,根据component-load.xml获得需要load 的 component的列表
接下来,启动每个component,在每个component的目录下有ofbiz-component.xml的配置文件,ofbiz根据此进行load component,然后 Container.start();所谓的load component其实也就是更改classpath
ComponentConfig.java对应了,ofbiz-component.xml,
在jetty中,会再次根据component是否配置了,webapp来确定加载那些webapp到WebApplicationContext中
2) classloader-container
3) jotm-container
用于transaction 处理
4) rmi-dispatcher
实例化RemoteDispatcherImpl,应该是启动了rmi server端,但是对于web开发可能没用,对于其他需要客户端应用程序,可以通过rmi client连接到rmi server.
实例化delegator,dispacher,从而读取了entity,service的配置
5) jetty-container
启动jetty服务
6) beanshell-container
启动beanshell
Classpath.java
使用一个vector记录classpath,vector中的每一条代表一个classpath中的项,如一个jar文件
然后重新构造一个ClassLoader,供所有后续使用,