[OFBiz]开发 三

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;

    }

 

 


[OFBiz]开发 三

然后,进入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);

            }

        }

    }

 

 



[OFBiz]开发 三

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

        }

 

你可能感兴趣的:(ofbiz)