Android設(shè)備上i-jetty環(huán)境的搭建
編譯i-jetty
1、將源碼download下來,http://code.google.com/p/i-jetty/downloads/list
2、解壓文件,進(jìn)入pom.xml所在目錄,執(zhí)行命令:mvncleaninstall,參照(http://code.google.com/p/i-jetty/wiki/BuildInstructions)
執(zhí)行過程中,出現(xiàn)了異常導(dǎo)致失敗,是生成classes.dex時(shí)內(nèi)存溢出的問題,我們用Eclipse來解決吧。
3、創(chuàng)建i-jetty的android項(xiàng)目,將下載的i-jetty源碼覆蓋進(jìn)去,
4、將下面目錄下的jar引入到i-jetty項(xiàng)目中:
C:\DocumentsandSettings\troyz\.m2\repository\org\eclipse\jetty
還需要servlet-api-2.5.jar。
5、編譯并將i-jetty安裝到設(shè)備中。
將web項(xiàng)目發(fā)布到設(shè)備上去。參照(http://code.google.com/p/i-jetty/wiki/DownloadableWebapps)
因?yàn)閍ndroid上的java虛擬機(jī)不能直接解釋執(zhí)行.class文件,所以首先需要把web項(xiàng)目中的.class文件和.jar文件轉(zhuǎn)換成虛擬機(jī)能識別的.dex文件。
這里假設(shè)web項(xiàng)目的目錄在:E:\demo。
1、需要將WEB-INF/classes目錄和lib目錄下的文件,用dx命令處理成classes.dex并放到lib目錄下。
dx.bat--dex--output=E:\demo\WEB-INF\lib\classes.zipE:\demo\WEB-INF\classesE:\demo\WEB-INF\lib
2、打成war包。
cd E:\demo
jar-cvfdemo.war*.*
3、生成classes.zip后,可以將原先的.class和.jar刪除掉。
4、通過i-jetty的download功能,把war下載到設(shè)備上去,也可以直接把demo.war放到/sdcard/jetty/webapps/目錄下。
5、啟動i-jetty服務(wù)器。
i-jetty對jsp的支持暫時(shí)似乎不完美,可能是我沒有找到好的方式,對html是支持的,包括html中的js,支持servlet。
androidtablet(sdk3.0)上,i-jetty的類加載器無法動態(tài)解壓加載classes.zip,報(bào)以下異常:
dalvikvm(22984):Can'topendexcache'/data/dalvik-cache/mnt@sdcard@JettyContext217761537@webinf@WEB-INF@lib@classes.zip@classes.dex':Nosuchfileordirectory
原因是/data/dalvik-cache目錄不可寫。
http://code.google.com/p/android/issues/detail?id=966
有一種解決方案:在打包android項(xiàng)目時(shí),把web項(xiàng)目中的java文件和jar文件放到android項(xiàng)目中一起打包,這樣就避免讓i- jetty動態(tài)加載dex文件了。war包中就不需要classes.zip,jar,.class文件了。但是這種方案有一個缺點(diǎn):不能動態(tài)部署新的 war包。
6、如果要在Web程序中,使用android的Context,需要這樣做:
- public void init(ServletConfig config) throws ServletException
- {
- super.init(config);
- android.content.ContentResolver resolver = (android.content.ContentResolver) config.getServletContext().getAttribute("org.mortbay.ijetty.contentResolver");
- android.content.Context androidContext = (android.content.Context) config.getServletContext().getAttribute("org.mortbay.ijetty.context");
- }