其实,Matrix的cleverpig早已完成了这个工作,并形成了文档。本人也是根据这篇文章进行试验的,但是在实践的过程中,遇到了不少的困难。故在此通过文字记录下自己的经历,一来是总结,二来是希望对Ant感兴趣的朋友们有所帮助或启发。
版本
Ant
Ant是apache发布的构建(Build)工具,用于控制程序的编译和打包。目前,最新版本为
Wtk打包的步骤
J2me开发,都离不开wtk,虽然在开发过程中,可以与JBuilder,Eclipse等IDE合成,但在最终发布时,通常都很使用wtk来打包。首先,分析一下wtk打包的过程,值得注意的是,这也是编写ant脚本的重要参照。
1:编译src目录下的.java源代码
2:调用java工具preverify.exe对class文件进行验证
3:将验证后的class以及res目录下的资源文件打成jar包
4:调用混淆工具,如:progard对jar包进行混淆,并解压缩
5:将经过混淆、解压缩后的class、资源文件生成jar包,并根据jad模版生成相应的jad文件,按成J2me程序的部署。
Ant脚本build.xml
注:这个脚本是在cleverpig提供的脚本基础进行略为改动。重点描述我在实现过程中,遇到问题的部分。
具体ant的Task命令说明,请参考Apache Ant
编译:
<echo message="编译程序"/>
<javac srcdir="${src.dir}" destdir="${build.dir}">
<bootclasspath path="${ midp.lib.dir }"/>
<classpath>
<fileset dir="${midp.lib.dir}" includes="*.jar"/>
</classpath>
</javac>
</target>
我在实践的过程中,由于实验的源代码中用到Midp2.0的方式,脚本在执行到编译这步时,始终抱错,无法编译像setScreenMode、platFormRequest等方法。Wtk相关的路径设置如下:
wtk.home.dir=E:\\Develpment\\SDK\\WTK25
programName=U2Browser
midp.lib.dir=${wtk.home.dir}\\lib
midp.lib.path=${midp.lib.dir}\\cldcapi11.jar;${midp.lib.dir}\\midpapi20.jar
指定的库包是midpapi20.jar就是MIDP2.0的呀,为何一直通不过呢?为此,我仔细阅读了相关文档,设置将JDK的javac命令再次温习一边。最终,发现问题出在bootclasspath与classpath的设置上面。以上脚本,bootclasspath设置在midp.lib.dir下,然后,classpath将midp.lib.dir中的所有*.jar文件导入。由于,javac在编译时,只会自动搜索bootclasspath下面的class和java文件,所以,无法将midpapi20.jar和cldcapi11.jar两个库包导入。此外,classpath是将midp.lib.dir目录下的所有jar导入作为库包。我的wtk\lib目录下,同时拥有midpapi10.jar和midpapi20.jar,以及cldcapi10.jar和cldcapi11.jar,所以在导入的时候,造成了库包的冲突,故无法编译midp2.0的方法。当然,这是本人之愚见,倘若哪天cleverpig大侠路过此处,可以解释一下这个问题。
正值高兴之余,以为能顺利编译通过时,编译又抱错,提示找不到StringBuilder类。Google之后,了解到StringBuilder属于JDK1.5的包,在”a”+b+”c”时,Java内部不再使用StringBuffer来重载String的’+’操作,而使用StringBuilder来代替。然而在J2me中,没有StringBuilder这个类,所以就问题就出现。解决办法,在编译时,指定JDK版本为1.4。
编译部分的脚步修改如下: Target都运行正常
<echo message="编译程序"/>
<javac srcdir="${src.dir}" destdir="${build.dir}" source="1.4>
<bootclasspath path="${ midp.lib.path}"/>
</javac>
</target>
剩余各Target都运行正常
其他的配置文件请到http://www.matrix.org.cn/resource/article/43/43770_Ant_J2me.html下载
思考
从我个人的使用感受而言,使用Ant打包J2me比Wtk更自动化一些。当然,如果只是打一个包,体现不出什么优势,如果在发布J2me程序时,要求同时打多个版本的包,那Ant的优势就体现出来了。相信有过J2me开发的朋友都有这方面的经验,发布时,由于版本太多,而各版本之间的差异可能就是键值或屏幕大小等比较细小的地方,如果使用Wtk打包,慌乱之中难免出错。使用Ant在配合一些配置文件,这样打包的过程就方便多了。
当然,使用ant对J2me打包,脚本显得臃肿,很多配置需要设定。不过,没有关系,已经有人更进一步了,这就是antenna,一个基于ant的j2me专用打包工具。除此之外,大名鼎鼎的J2mepolish也是使用ant来打包,这也是其标榜的重要优势之一。
参考文章
http://www.matrix.org.cn/resource/article/43/43770_Ant_J2me.html 作者:cleverpig
http://dev.yesky.com/251/2264751.shtml 作者 mingjava
http://blog.csdn.net/Mailbomb/archive/2006/05/07/711332.aspx 作者 陈跃峰