<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    程序人生

    在Java中摸爬滾打的日子

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      6 Posts :: 1 Stories :: 19 Comments :: 0 Trackbacks

    提供支撐的Bundles

    --- 瀟湘振宇 2010-06-26  

    上一篇中,我們已經(jīng)為這基于OSGiWeb應(yīng)用搭建了項(xiàng)目框架,但其中涉及到有幾個(gè)支撐OSGi環(huán)境下的SSH框架的Bundles的改造或提供未曾給大家詳細(xì)介紹。本篇內(nèi)容就是為詳細(xì)介紹這幾個(gè)Bundles的作用及創(chuàng)建的過程。


    CGLIB的改造

    Cglib的改造曾在系列一中有提到,為了解決Hibernate在調(diào)用CGLIB來創(chuàng)建代理對(duì)象時(shí)找不到HibernateProxy對(duì)象的問題。改造也相當(dāng)?shù)暮?jiǎn)單,只需要將AbstractClassGenerator類中的getClassLoader方法中的ClassLoad改為當(dāng)前類所在的ClassLoad即可,如下所示:

    public ClassLoader getClassLoader() {

            ClassLoader t = classLoader;

            /**

             * FIXME 更改classLoad的加載順序 

         *  if (t == null) {

         *      t = getDefaultClassLoader();

         *  }

         *  if (t == null) {

         *      t = getClass().getClassLoader();

         *  }

             */

            if (t == null) {

                t = getClass().getClassLoader();

            }

            if (t == null) {

                t = getDefaultClassLoader();

            }

            if (t == null) {

                t = Thread.currentThread().getContextClassLoader();

            }

            if (t == null) {

                throw new IllegalStateException("Cannot determine classloader");

            }

            return t;

        }

    以上是改造的內(nèi)容,而我們?cè)陧?xiàng)目中應(yīng)用的時(shí)候需要的是一個(gè)OSGiBundle,因此我們可以通過Pax-construct來創(chuàng)建這個(gè)Bundle

    大致過程是:首先在org.ideawork.osgi工程下面新建名為warpper的模塊,再到warpper目錄下面新建cglibbundle工程,并將其導(dǎo)入到IDE環(huán)境中。然后從官方網(wǎng)站下載cglib的源碼,將源碼添加到相應(yīng)的工程,再對(duì)需要修改的地方修改之。

    具體步驟如下:

    1. 新建warpper的模塊

    通過Pax-Construct的命令來新建此warpper模塊,如下:

    >cd osgiapp

    >pax-create-module -g org.ideawork.osgiapp -a osgiapp-warpper -v 1.0.0

    其中osgiapp為當(dāng)前這應(yīng)用的根目錄,cd osgiapp為進(jìn)入到根目錄下,而下面的命令則是創(chuàng)建module工程,這在上篇已經(jīng)介紹過。

    2. 新建cglibbundle

    Cglibbundle工程的創(chuàng)建跟上篇中其他bundle的創(chuàng)建類似,命令如下:

    >cd osgiapp-warpper

    >pax-create-bundle -p org.ideawork.osgiapp.warpper.cglib -n osgiapp-warpper-cglib -g org.ideawork.osgiapp.warpper -v 2.1.3-001

             這里之所以要指定版本號(hào)為2.1.3-001是因?yàn)槲覀兏脑斓氖?/font>2.1.3版的cglib,而后面的001代表的是我們自己的warpper工程的小版本號(hào),如果以后有對(duì)此cglib bundle升級(jí),但cglib的版本還是2.1.3,那時(shí)候我們就升級(jí)001這個(gè)版本號(hào)。

    3. 導(dǎo)入IDEEclipse

    導(dǎo)入方式如上篇所述,導(dǎo)入后的視圖如下:


    4. 添加cglib的源碼

    我們將從官方網(wǎng)站下載的cglib的源碼添加到cglib bundle下的src/main/java目錄下,并將新建此bundle工程時(shí)默認(rèn)生成的org.ideawork.osgiapp.warpper.cglib的包刪除掉。刷新當(dāng)前項(xiàng)目,此時(shí)會(huì)出現(xiàn)很多的紅叉叉,這是因?yàn)槿鄙傧嚓P(guān)的依賴包所致。因此我們需要在此bundle工程下的pom.xml文件中添加如下依賴信息:

    <dependencies>

    <dependency>

    <groupId>org.objectweb.asm</groupId>

    <artifactId>com.springsource.org.objectweb.asm</artifactId>

    <version>1.5.3</version>

    <scope>compile</scope>

    <optional>true</optional>

    </dependency>

    <dependency>

    <groupId>org.objectweb.asm</groupId>

    <artifactId>

    com.springsource.org.objectweb.asm.attrs

    </artifactId>

    <version>1.5.3</version>

    <scope>compile</scope>

    <optional>true</optional>

    </dependency>

    <dependency>

    <groupId>org.objectweb.asm</groupId>

    <artifactId>com.springsource.org.objectweb.asm.util</artifactId>

    <version>2.2.0</version>

    <scope>compile</scope>

    <optional>true</optional>

    </dependency>

    <dependency>

    <groupId>org.codehaus.aspectwerkz</groupId>

    <artifactId>com.springsource.org.codehaus.aspectwerkz.hook</artifactId>

    <version>1.0.0</version>

    <scope>compile</scope>

    <optional>true</optional>

    </dependency>

    <dependency>

    <groupId>org.apache.ant</groupId>

    <artifactId>com.springsource.org.apache.tools.ant</artifactId>

    <version>1.7.0</version>

    <scope>compile</scope>

    <optional>true</optional>

    </dependency>

    </dependencies>

    5. 修改ClassLoad加載順序

    修改AbstractClassGenerator類中的getClassLoader方法中的ClassLoad加載順序已經(jīng)在上面描述過,大家按上面的修改即可。

    6. 完善MANIFEST.MF文件中的元數(shù)據(jù)信息

    這里關(guān)于MANIFEST.MF文件中的一些元數(shù)據(jù),我們不想讓bnd為我們來生成,因?yàn)橥ㄟ^bnd工具生成的元數(shù)據(jù),有時(shí)候生成的元數(shù)據(jù)過于龐大。因此我們?cè)?/font>osgi.bnd文件中添加相關(guān)的元數(shù)據(jù)信息,并刪除新建項(xiàng)目時(shí)默認(rèn)生成的Bundle-Activator元素,需要添加的內(nèi)容如下:

    Export-Package = net.sf.cglib.asm;version="2.1.3","

     net.sf.cglib.asm.attrs;version="2.1.3";uses:="net.sf.cglib.asm","

     net.sf.cglib.beans;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.core","

     net.sf.cglib.core;version="2.1.3";uses:="net.sf.cglib.asm","

     net.sf.cglib.proxy;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.core,net.sf.cglib.reflect","

     net.sf.cglib.reflect;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.core","

     net.sf.cglib.transform;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.core,org.apache.tools.ant,org.apache.tools.ant.types","

     net.sf.cglib.transform.hook;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.transform","

     net.sf.cglib.transform.impl;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.core","

     net.sf.cglib.util;version="2.1.3";uses:="net.sf.cglib.asm,net.sf.cglib.core"

    Bundle-ClassPath = .

    Bundle-Version = 2.1.3

    JarJarStringTransformer = com.tonicsystems.jarjar.GeneratedStringTransformer

    Bundle-Name = CGLIB Code Generation Library

    Import-Package = org.apache.tools.ant;version="[1.7.0, 2.0.0)";resolution:=optional,"

     org.apache.tools.ant.types;version="[1.7.0, 2.0.0)";resolution:=optional,"

     org.codehaus.aspectwerkz.hook;version="[0.8.1, 0.9.0)";resolution:=optional,"

     org.objectweb.asm;version="[1.5.3, 2.0.0)";resolution:=optional,"

     org.objectweb.asm.attrs;version="[1.5.3, 2.0.0)";resolution:=optional

    DynamicImport-Package = *

    7. 編譯打包

    編譯打包的工作我們是交給Maven來幫我們做,但我們需要修改cglib bundle工程下的pom.xml文件中的properties元素的相關(guān)屬性內(nèi)容做。需要將<bundle.namespace>org.ideawork.osgiapp.warpper.cglib</bundle.namespace>修改成<bundle.namespace>net.sf.cglib</bundle.namespace>,這樣修改的目的是因?yàn)樵诶?font face="Courier New">Maven編譯打包的時(shí)候,bnd插件會(huì)根據(jù)bundle工程的namespace的定義來導(dǎo)出相關(guān)的包,如果項(xiàng)目中的classis文件不在其namespace范圍內(nèi),打包時(shí)被會(huì)被忽略掉。

    修改完pom.xml文件后,在命令行窗口下進(jìn)入到cglib bundle工程的目錄下,運(yùn)行mvn -e clean install命令就可以將cglib bundle安裝到本地Maven倉庫。到這里cglib的改造完成。


    封裝Mysql Connector

    因?yàn)閿?shù)據(jù)庫用的是Mysql,數(shù)據(jù)庫連接池使用的是C3p0,因?yàn)?/font>C3p0在創(chuàng)建數(shù)據(jù)庫連接池的時(shí)候需要使用到指定的驅(qū)動(dòng)包,而C3p0作為一個(gè)獨(dú)立的Bundle,不能偶合具體的驅(qū)動(dòng)程序包,所以C3p0在創(chuàng)建數(shù)據(jù)庫連接池時(shí),需要我們提供一個(gè)Fragment來讓其導(dǎo)入我們指定的驅(qū)動(dòng)程序包,這曾在系列一中也已經(jīng)說到過。但這里我們將不通過提供另一個(gè)Fragment來實(shí)現(xiàn)此需求,因?yàn)槲蚁胧褂米钚掳娴?/font>Mysql connector 5.1.13,但這個(gè)版本的Mysql connectorEBR倉庫中尚不存在,因此我借這個(gè)封裝Mysql connector的機(jī)會(huì)來解決C3p0使用mysql的驅(qū)動(dòng)包的問題,并向大家介紹如何使用pax-construts來創(chuàng)建warpper工程。

    大致流程是:在命令行窗口下,進(jìn)入到osgiapp/osgiapp-warpper目錄下,運(yùn)行pax-construts創(chuàng)建warpper工程的命令,然后修改相關(guān)的配置文件,編譯打包即可。

    具體步驟如下:

    1. 創(chuàng)建osgiapp-warpper-mysqlconnector

    這里的mysqlconnector跟與面的cglib都是通過改造第三方的包來達(dá)到目的的,因此我們將其統(tǒng)統(tǒng)放在了warpper模塊之中,但這里的mysqlconnectorcglib還是有區(qū)別的,cglib是通過pax-construtspax-create-bundle命令創(chuàng)建的,而這里我們將通過pax-wrap-jar的命令來創(chuàng)建。命令如下:

    這里的-g-a-v跟之前的含義是一樣的,分別表示groupIdartifactIdversion,但這里的這些指是的將要被我們包裝的Jar包的Maven屬性。如果此Jar包不存在本地的Maven倉庫中,Maven將會(huì)從網(wǎng)上的Maven2的倉庫中下載此Jar文件。

    2. 修改相關(guān)配置

    成功創(chuàng)建工mysql-connectorwarpper工程后,我們需要修改的有pom.xml文件跟osgi.bnd文件。

    修改pom.xml文件中的artifactIdosgiapp-warpper-mysql-connector-java,并將version改成5.1.13-001,還有就是properties中的bundle.symbolicName成改org.ideawork.osgiapp.wrapper.mysql.connector.java

    另外在osgi.bnd文件中添加如下信息:

    pax-wrap-jar -g mysql -a mysql-connector-java -v 5.1.13

    3. 編譯打包

    編譯打包直接運(yùn)行Maven的命令即可。

    Tomcat提供Fragment

    為了使此web應(yīng)用能正常訪問,我們需要為Tomcat 相關(guān)的兩個(gè)Bundle提供兩個(gè)Fragment。這在系列一中曾有說到。

    需要使用到這兩個(gè)FragmentBundleartifactId分別是:com.springsource.org.apache.catalinacatalina.start.osgi,前者是apache公司下的包,后者是springframeworkspringDMweb支持而提供的。

    具體的創(chuàng)建步驟如下:

    1. 新建fragment的模塊

    通過Pax-Construct的命令來新建此fragment模塊,如下:

    Import-Package = ""

    DynamicImport-Package = *

    Fragment-Host = com.springsource.com.mchange.v2.c3p0

    2. 新建兩個(gè)Fragmentbundle工程

    Cglibbundle工程的創(chuàng)建跟上篇中其他bundle的創(chuàng)建類似,命令如下:

    3. 修改配置文件

    將新建的Fragment工程導(dǎo)入到IDE環(huán)境,導(dǎo)入后工程視圖如下:


    這里我們只需簡(jiǎn)單的修改一下兩個(gè)Fragment Bundle工程下的osgi.bnd文件并在工程的資源文件夾下添加幾個(gè)配置文件即可。

    a) 對(duì)于osgiapp-fragment-tomcat-conf這個(gè)Fragment,需要為其添加以下這四個(gè)配置文件,如圖:

       

    這四個(gè)配置文件來自于普通的tomcat安裝包中,不過需要版本匹配才行。比如這里用到的tomcat bundle6.0.15的那就需要從6.0.15版的傳統(tǒng)的tomcat的安裝目錄下拷貝。

    然后修改其osgi.bnd文件,此osgi.bnd文件中的內(nèi)容如下:

    >cd osgiapp

    >pax-create-module -g org.ideawork.osgiapp -a osgiapp-fragment -v 1.0.0

    >cd osgiapp-fragment

    >pax-create-bundle -p org.ideawork.osgiapp.fragment.tomcat.conf -n osgiapp-fragment-tomcat-conf -g org.ideawork.osgiapp.fragment -v 1.0.0

    >pax-create-bundle -p org.ideawork.osgiapp.fragment.tomcat.start.conf -n osgiapp-fragment-tomcat-start-conf -g org.ideawork.osgiapp.fragment -v 1.0.0

    此處的Fragment-Host=com.springsource.org.apache.catalina指當(dāng)前這個(gè)Fragment的宿主為com.springsource.org.apache.catalinabundleFragment-Host的值表示的是宿主BundleBundle-SymbolicName

    b) 對(duì)于osgiapp-fragment-tomcat-start-conf Fragment,需要像上面的一樣添加一個(gè)server.xml的配置文件,這個(gè)文件的來由跟上面所說的一樣。添加后的視圖如下:

       

    然后再修改其osgi.bnd文件,內(nèi)容如下:

    Export-Package = ""

    Private-Package = 

    Import-Package = ""

    Fragment-Host = com.springsource.org.apache.catalina


    總結(jié)

    通過以上的操作得到四個(gè)bundle,這四個(gè)bundle是這個(gè)OSGiweb應(yīng)用所必須的,當(dāng)然這樣的車輪只需要造一次,當(dāng)你將需要再新建此類基于OSGi環(huán)境的SSH Web工程時(shí),就可以直接拿過來用了。其中Tomcat的兩個(gè)Fragment主要是主含些配置文件,這個(gè)在項(xiàng)目部署的時(shí)候可能會(huì)需要修改的,具體得視應(yīng)用而定。

    完成了這章中的四個(gè)Bundle后,我們可以將這四個(gè)Bundle應(yīng)用于系列三中的框架中來進(jìn)行測(cè)試。也許這章的內(nèi)容應(yīng)該位于上篇之前介紹,大家就當(dāng)這是對(duì)前一篇的補(bǔ)充吧。


    附件:項(xiàng)目源碼 osgiapp.zip

    posted on 2010-06-26 16:24 瀟湘振宇 閱讀(3816) 評(píng)論(5)  編輯  收藏 所屬分類: OSGi系列

    Feedback

    # re: 基于OSGi的Web應(yīng)用開發(fā)系列四(提供支撐的Bundles)[未登錄] 2010-06-28 16:33 root
    很強(qiáng)大,支持下  回復(fù)  更多評(píng)論
      

    # re: 基于OSGi的Web應(yīng)用開發(fā)系列四(提供支撐的Bundles) 2010-07-23 23:52 zhangls
    謝謝作者能和大家分享OSGi成果~ 本人最近也在研究osgi,能否發(fā)我一份源碼,希望能有更多的交流。謝謝~!  回復(fù)  更多評(píng)論
      

    # re: 基于OSGi的Web應(yīng)用開發(fā)系列四(提供支撐的Bundles) 2010-07-23 23:53 zhangls
    email:zhanglingsi@yahoo.com.cn   回復(fù)  更多評(píng)論
      

    # re: 基于OSGi的Web應(yīng)用開發(fā)系列四(提供支撐的Bundles) 2010-07-28 09:24 瀟湘振宇
    @zhangls
    源碼就在本篇的末尾,只是因?yàn)樽罱臼旅Γ瑳]有繼續(xù)這系列文章的編寫,將上面源碼包導(dǎo)入到Eclipse中,再用Maven命令來編譯打包安裝后,再用mvn pax:provision的命令就可以啟動(dòng)這個(gè)OSGi web應(yīng)用,只是系列文章中說到的用戶登錄的功能尚未實(shí)現(xiàn)。但那只是業(yè)務(wù)方面,整體的開發(fā)腳手架已經(jīng)搭建起來了,運(yùn)行也是沒問題的。
    如果對(duì)這里說到的運(yùn)行的命令不懂,可以仔細(xì)閱讀本系列前幾篇文章。  回復(fù)  更多評(píng)論
      

    # re: 基于OSGi的Web應(yīng)用開發(fā)系列四(提供支撐的Bundles) 2010-08-10 09:36 瀟湘振宇
    關(guān)于mvn-pax-plugin插件,這里給出兩個(gè)開發(fā)過程中常用的參數(shù),如下:
    <param>--vmOptions=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000</param>
    <param>--repositories=+http://scm.ops4j.org/repos/ops4j/projects/pax/runner-repository/</param>
    其中--vmOptions參數(shù)是指設(shè)置JVM的一些屬性,如上所示開啟遠(yuǎn)程Java調(diào)試。
    而--repositories是pax自己的一個(gè)參數(shù)來著。有時(shí)候在用pax:provision命令時(shí),其老是去訪問網(wǎng)絡(luò)下載或檢測(cè)相關(guān)pax的包,浪費(fèi)掉了我們開發(fā)人員寶貴的時(shí)間,加上這個(gè)參數(shù)后會(huì)好很多。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产午夜亚洲精品理论片不卡| 免费在线看黄的网站| 亚洲精品9999久久久久无码| 亚洲人成在线免费观看| 亚洲精品自在线拍| 亚洲精品综合久久中文字幕| 亚洲第一页在线视频| 亚洲国产美女精品久久久久| 亚洲国产成人va在线观看网址| 亚洲剧情在线观看| 亚洲香蕉在线观看| 亚洲第一成年网站视频| 粉色视频免费入口| 一区在线免费观看| 99久久国产精品免费一区二区 | 婷婷精品国产亚洲AV麻豆不片 | 亚洲精品乱码久久久久久中文字幕 | 亚洲av乱码一区二区三区按摩| 亚洲AV无码一区二区三区性色| 国产亚洲精品第一综合| 一级毛片人与动免费观看| 中国精品一级毛片免费播放| 国产精品99精品久久免费| 69视频在线观看高清免费| 毛片网站免费在线观看| 国产伦精品一区二区三区免费下载 | 国产精品无码永久免费888| 东方aⅴ免费观看久久av| 日本免费人成视频在线观看| 国国内清清草原免费视频99| 日韩免费电影在线观看| 2048亚洲精品国产| 亚洲一区二区中文| 亚洲gay片在线gv网站| 国产免费久久精品丫丫| 91精品全国免费观看含羞草| 岛国大片免费在线观看| 久久亚洲国产精品五月天婷| 亚洲精品国产啊女成拍色拍| 亚洲国产一区二区三区在线观看| 国产精品免费久久|