由于新项目需要在一台Android平台的设备中布署WEB服务器并提供内网接入者通过浏览器访问WEB程序,遂考虑了Google的开源项目Jetty for Android,本来由于没有接触过已经做好心理准备会遇到一系列的问题,但猜到了开始却没猜到结局,过程相当坎坷。这也是这篇随笔出现的原因,一来为自己长记性,二来吧,对于Jetty for Android,网路上那些群魔乱舞的资料实在是太让我无语了,毫无用处的博文实在是太多太多,有些在看的时候把人都看懵圈了,所以本篇随笔以作整理之用。
首先惯例环境说明:Windows XP sp3 (苦逼公司)、JDK1.7、Apache Maven 3.2.5、Git 2.6.4、eclipse luna 4.4.2。
关于环境的准备这里就不作说明了,相信作为软件开发人员,不管老手菜鸟以上这些工具应该都玩得666的,怎么会没有安装不会配置呢。但还是要确定以下字段已声明在系统变量,并将"import"文字后说明的目录引入到Path属性中:
JAVA_HOME -- java jdk root path --import:\bin;\jre\bin
MAVEN_HOME -- maven root path --import:\bin
ANDROID_HOME -- android sdk root path --import:\tools;\platform-tools
1,Download
参考Jetty for Android项目主页利用Git将i-jetty代码同步到本地。
$ git clone https://github.com/jetty-project/i-jetty.git
在查看Jetty for Android项目主页时,注意到页面中在说明Depedencies时并没有说明Maven 的版本,但项目中Pom清单默认所依赖的类库Jar包的版本若与当前系统使用的Maven 的版本互相不兼容,后面编译项目时会出现一系列的问题,这点需要注意,关于项目中类库的版本与Maven版本的支持关系在下面有说明。
2,Building
本项目包含apk项目及war项目,下载完毕首先做的不应该是打开eclipse 来 Import Maven Project,不然等着你的将会是恶梦连篇,而首先要做的应该是修改项目Pom文件以适应本地环境,再使用Maven同步相应的依赖类库项,确定本地环境能适应项目的编译过程。
项目中默认在使用老得不能再老的Android API 4 平台,作者也是够念旧的,我们暂时不改动它就用<platform>4</platform>,但请确认系统中已经下载了API 4 的SDK Platform,否则参考此亲提供的下载Android API 4 platform。
注意解压时不要直接解压到ANDROID_HOME中,参考SDK的目录结构,应在platforms,samples,system-images目录中建立android-4放置相应文件,tools目录内文件请对位入座。
此时我们还需要根据Maven 版本来修改项目中的Pom文件,例如我的为Apache Maven 3.2.5:i-jetty\i-jetty\i-jetty-ui\pom.xml
<plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId><!-- 改这里 --> <version>3.8.2</version><!-- 再改这里 --> <extensions>true</extensions> <configuration> <sdk> <platform>4</platform> </sdk> <deleteConflictingFiles>true</deleteConflictingFiles> <extractDuplicates>true</extractDuplicates> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <executions> <execution> ... </execution> </executions> </plugin> <profiles> <profile> <id>sign</id> <build> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId><!-- 还有改这里 --> <configuration> <sign> <debug>false</debug> </sign> </configuration> </plugin> </plugins> </build> </profile> </profiles>
* 注:maven-android-plugin在3.0.0版本开始已经更名为android-maven-plugin,而项目中还在使用maven-android-plugin : 2.9.0-beta-5,作者年龄暴露无遗。
若是其它Maven 版本具体请参考以下的版本支持修改范围:
Maven 3.0.3 -- android-maven-plugin : 3.0.0
Maven 3.0.5 -- android-maven-plugin : 3.3.0~3.5.3
Maven 3.1.1 -- android-maven-plugin : 3.8.0~3.8.1
修改完毕,命令行定位到i-jetty\i-jetty目录开始编译apk:
mvn clean install
此时Maven会根据Pom清单同步依赖项到Maven的本地repository中,到这里你就开始祈祷吧... --(此处根据网速快进若时间)-- 如果一切正确无误将会出现以下的编译结果:
3,Using i-jetty
检查i-jetty-ui\target\发现已经编译成功的APK -- i-jetty-3.2-SNAPSHOT.apk ,安装到设备中:
adb install -s "C:\Documents and Settings\Administrator\i-jetty\i-jetty\i-jetty-ui\target\i-jetty-3.2-SNAPSHOT.apk"
4,Building console
继续编译WEB项目,同样是修改Pom清单适应本地编译环境:i-jetty\console\webapp\pom.xml -- 第70行开始
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2</version> <executions> <!-- Convert the compiled classes into a clases.dex. --> <execution> <id>generate-dex</id> <phase>process-classes</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>java</executable> <arguments> <argument>-jar</argument> <!-- 改为从android api 4 解压出来的dx.jar的正确路径需要用来将clss文件打包成dex文件 --> <argument>${env.ANDROID_HOME}/build-tools/android-4.4/lib/dx.jar</argument> <!--<argument>-JXmx1024M</argument>--> <argument>--dex</argument> <argument>--verbose</argument> <argument>--core-library</argument> <argument>--output=${project.build.directory}/classes.dex</argument> <argument>--positions=lines</argument> <argument>${project.build.directory}/classes/</argument> <argument>${project.build.directory}/generated-classes/</argument> </arguments> </configuration> </execution> </executions> </plugin>
修改完毕,命令行定位到i-jetty\console\webapp目录开始编译war:
mvn clean install
又是一阵焦急的等待...
5,Using console
adb push "C:\Documents and Settings\Administrator\i-jetty\console\webapp\target\console-3.2-SNAPSHOT.war" /storage/sdcard0/jetty/webapps/
6,Browser console
查看设备WiFi Connector Information并从浏览器中访问
adb shell [email protected]:/ $ netcfg