zoukankan      html  css  js  c++  java
  • [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-win32ofbizapache-ofbiz-10.04frameworkcatalinaofbiz-component.xml
    配置的是Tomcat的模块

    E:eclipse-SDK-3.7.1-win32ofbizapache-ofbiz-10.04applicationscontentofbiz-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-win32ofbizapache-ofbiz-10.04ofbiz.jar;  ------------>启动类
    E:jdk1.6.0_20lib ools.jar;
    E:eclipse-SDK-3.7.1-win32ofbizapache-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-win32ofbizapache-ofbiz-10.04frameworkaseuildlibofbiz-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);
            }
  • 相关阅读:
    20172325 2017-2018-2 《Java程序设计》第十周学习总结
    20172306 2018-2019《Java程序设计与数据结构课堂测试补充报告》
    20172306 2018-2019-2 《Java程序设计》第五周学习总结
    20172306 2018-2019 《程序设计与数据结构》第四周总结
    20172306 2018-2019《程序设计与数据结构》实验一报告
    20172306 2018-2019 《程序设计与数据结构》第二周总结
    20172306 2018-2019 《Java程序设计与数据结构》第一周学习总结
    20172306 2017-2018-2《程序设计与数据结构》课程总结
    20172306《程序设计与数据结构》实验五报告
    20172306《Java程序设计与数据结构》第一周总结
  • 原文地址:https://www.cnblogs.com/ofbiz/p/3145733.html
Copyright © 2011-2022 走看看