1. Debug 不要在Eclipse中使用Ant来启动ofbiz, 因为在Eclipse中无法kill掉Ant的进程,而ofbiz又没有提供stop的方法。(有一个hook shutdown的方法,但是没有作用) 使用startofbiz.bat来启动ofbiz, 打开debug模式,端口5005. 注意:如果需要对org.ofbiz.base.start.Start进行debug的话,需要修改: -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 2.ofbiz-component.xml 总共有60个ofbiz-componnet.xml文件。 E:\eclipse-SDK-3.7.1-win32\ofbiz\apache-ofbiz-10.04\framework\catalina\ofbiz-component.xml 配置的是Tomcat的模块 E:\eclipse-SDK-3.7.1-win32\ofbiz\apache-ofbiz-10.04\applications\content\ofbiz-component.xml 配置的是content web应用程序的模块 它含有webapp节点:
<webapp name="content" title="Content" server="default-server" location="webapp/content" base-permission="CONTENTMGR" mount-point="/content"/>
3.启动过程:org.ofbiz.base.start.Start
private void startStartLoaders() { // start the loaders for (StartupLoader loader: loaders) { try { loader.start(); } catch (StartupException e) { e.printStackTrace(); System.exit(99); } } serverStarted = true; }
然后,进入org.ofbiz.base.container.ContainerLoader的start()方法中, 启动所有的Container:
public void start() throws StartupException { Debug.logInfo("[Startup] Starting containers...", module); // start each container object for (Container container: loadedContainers) { try { container.start(); } catch (ContainerException e) { throw new StartupException("Cannot start() " + container.getClass().getName(), e); } catch (java.lang.AbstractMethodError e) { throw new StartupException("Cannot start() " + container.getClass().getName(), e); } } }
tomcat, 就是其中的一个作为container启动的模块。 4. 关于ofbiz-component.xml的DTD: http://ofbiz.apache.org/dtds/ofbiz-component.xsd
<classpath type="jar" location="lib/*"/> ------------------>classpath相关 <classpath type="jar" location="build/lib/*"/> <classpath type="dir" location="config"/> <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>
classpath可以支持这两种形式:
<classpath type="jar" location="lib/product.jar"/> <classpath type="dir" location="classes"/>
5.配置文件读取过程: 1), 先从System.getProperty("ofbiz.system.props")中,找到global的配置文件,加载到System properties中。 2),通过String cfgFile = Start.getConfigFileName(firstArg);得到类似于: org/ofbiz/base/start/start.properties 这样的配置文件。 6.classpath的加载: org.ofbiz.base.start.Start.initClasspath() org.ofbiz.base.start.Start.loadLibs(String, boolean) 它将把以下路径,添加到classpath中去: E:\eclipse-SDK-3.7.1-win32\ofbiz\apache-ofbiz-10.04\ofbiz.jar; ------------>启动类 E:\jdk1.6.0_20\lib\tools.jar; E:\eclipse-SDK-3.7.1-win32\ofbiz\apache-ofbiz-10.04 ------------>ofbiz HOME E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/lib E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/build/lib/ofbiz-base.jar E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/dtd E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/config 而: containerconfig=E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/config/ofbiz-containers.xml 7.Debug信息输出:启动JVM时,加上-DDEBUG=true属性. if (System.getProperty("DEBUG") != null) 8.启动过程中:
if (fullInit) { // initialize the classpath initClasspath(); ---------->重要 // initialize the log directory initLogDirectory(); // initialize the listener thread initListenerThread(); // initialize the startup loaders initStartLoaders(); ---------->重要 // set the shutdown hook if (config.useShutdownHook) { setShutdownHook(); } else { System.out.println("Shutdown hook disabled"); } } } start.init(args, true); start.start();
=============>start.init(args, true); 1. 将执行start.properties里面的ofbiz.start.loader1=org.ofbiz.base.container.ContainerLoader 2. 它的org.ofbiz.base.container.ContainerLoader.load(Config, String[])方法, 将会被执行。 3. 把E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/config/ofbiz-containers.xml作为参数传进来 4. 将会从ofbiz-containers.xml中读取9个containers,其中包括了tomcat的那个: [ org.ofbiz.base.container.ContainerConfig$Container@185fe0c, org.ofbiz.base.container.ContainerConfig$Container@1e9f5cc, org.ofbiz.base.container.ContainerConfig$Container@1082823, org.ofbiz.base.container.ContainerConfig$Container@831a91, org.ofbiz.base.container.ContainerConfig$Container@1453d72, org.ofbiz.base.container.ContainerConfig$Container@c5186e, org.ofbiz.base.container.ContainerConfig$Container@1c70315, org.ofbiz.base.container.ContainerConfig$Container@9b59a2, org.ofbiz.base.container.ContainerConfig$Container@119db9e ] 10个配置的containers: component-container classloader-container commons-vfs-container webslinger-container naming-container rmi-dispatcher catalina-container --------->tomcat ajp-connector birt-container beanshell-container 得到:
<container name="catalina-container" class="org.ofbiz.catalina.container.CatalinaContainer">
这里只是收集作用,把它们(9个containers) 放到org.ofbiz.base.container.ContainerLoader.loadedContainers存起来。 =============>start.start(); 1. 将执行start.properties里面的ofbiz.start.loader1=org.ofbiz.base.container.ContainerLoader 2. 它的org.ofbiz.base.container.ContainerLoader.start()方法, 将会被执行。 3.它会把刚才记录的9个containers都进行初始起动的。 9.考察Tomcat的启动过程:
<container name="catalina-container" class="org.ofbiz.catalina.container.CatalinaContainer">
先是初始化: org.ofbiz.catalina.container.CatalinaContainer.init(String[], String) ------>它是在start.init(args, true);的时候,被带起来执行的。 org.ofbiz.catalina.container.CatalinaContainer.loadComponents() ---->循环 org.ofbiz.catalina.container.CatalinaContainer.createContext(WebappInfo) 然后,才是在start.start();的时候,被启动的: org.ofbiz.catalina.container.CatalinaContainer.start() 信息:debug在:org.ofbiz.catalina.container.CatalinaContainer.loadComponents()
// load the applications List<ComponentConfig.WebappInfo> webResourceInfos = ComponentConfig.getAllWebappResourceInfos();
可以得到44个web应用程序。 10.一个很重要的jar包: E:\eclipse-SDK-3.7.1-win32\ofbiz\apache-ofbiz-10.04\framework\base\build\lib\ofbiz-base.jar 它里面的:org.ofbiz.base.component.ComponentConfig.getAllComponents() 也是一个很重要的方法。 关注一下:componentConfigs.put(componentConfig.getGlobalName(), componentConfig); 是什么时候被调用,被填上值的。 它是在start.init(args, true);的时候,它是配置在ofbiz-containers.xml中的第一个节点:
<!-- load the ofbiz component container (always first) --> <container name="component-container" class="org.ofbiz.base.container.ComponentContainer"/>
它是作为一个container被启动的,它的作用是负责收集所有的component模块信息。 收集的结果,放在: org.ofbiz.base.component.ComponentConfig.componentConfigs protected static Map<String, ComponentConfig> componentConfigs 以备接下来的其它的container(如:tomcat),初始化webapp时使用。 每一个ofbiz-component.xml对应于下面的这个类: org.ofbiz.base.component.ComponentConfig.ComponentConfig(String, String) ofbiz-component.xml里面的节点,都是在这个类的构造方法中被解析的,包括webapp:
// webapp - webappInfos for (Element curElement: UtilXml.childElementList(ofbizComponentElement, "webapp")) { WebappInfo webappInfo = new WebappInfo(this, curElement); this.webappInfos.add(webappInfo); } // classpath - classpathInfos for (Element curElement: UtilXml.childElementList(ofbizComponentElement, "classpath")) { ClasspathInfo classpathInfo = new ClasspathInfo(this, curElement); this.classpathInfos.add(classpathInfo); }