其实,Matrixcleverpig早已完成了这个工作,并形成了文档。本人也是根据这篇文章进行试验的,但是在实践的过程中,遇到了不少的困难。故在此通过文字记录下自己的经历,一来是总结,二来是希望对Ant感兴趣的朋友们有所帮助或启发。

 

版本

 

Ant 1.7.0  ,Wtk2.5,JDK1.5 

Ant简介 

 

Antapache发布的构建(Build)工具,用于控制程序的编译和打包。目前,最新版本为 1.7.0 。关于ant的相关配置,请仔细阅读Apache Ant 1.7.0 Manual 

Wtk打包的步骤

 

J2me开发,都离不开wtk,虽然在开发过程中,可以与JBuilderEclipseIDE合成,但在最终发布时,通常都很使用wtk来打包。首先,分析一下wtk打包的过程,值得注意的是,这也是编写ant脚本的重要参照。

1:编译src目录下的.java源代码

2:调用java工具preverify.execlass文件进行验证

3:将验证后的class以及res目录下的资源文件打成jar

4:调用混淆工具,如:progardjar包进行混淆,并解压缩

5:将经过混淆、解压缩后的class、资源文件生成jar包,并根据jad模版生成相应的jad文件,按成J2me程序的部署。 

Ant脚本build.xml

 

注:这个脚本是在cleverpig提供的脚本基础进行略为改动。重点描述我在实现过程中,遇到问题的部分。

 

具体antTask命令说明,请参考Apache Ant 1.7.0 Manual

 

编译:

        <target name="complie" depends="init" description="编译">                
        
<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的方式,脚本在执行到编译这步时,始终抱错,无法编译像setScreenModeplatFormRequest等方法。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的呀,为何一直通不过呢?为此,我仔细阅读了相关文档,设置将JDKjavac命令再次温习一边。最终,发现问题出在bootclasspathclasspath的设置上面。以上脚本,bootclasspath设置在midp.lib.dir下,然后,classpathmidp.lib.dir中的所有*.jar文件导入。由于,javac在编译时,只会自动搜索bootclasspath下面的classjava文件,所以,无法将midpapi20.jarcldcapi11.jar两个库包导入。此外,classpath是将midp.lib.dir目录下的所有jar导入作为库包。我的wtk\lib目录下,同时拥有midpapi10.jarmidpapi20.jar,以及cldcapi10.jarcldcapi11.jar,所以在导入的时候,造成了库包的冲突,故无法编译midp2.0的方法。当然,这是本人之愚见,倘若哪天cleverpig大侠路过此处,可以解释一下这个问题。

正值高兴之余,以为能顺利编译通过时,编译又抱错,提示找不到StringBuilder类。Google之后,了解到StringBuilder属于JDK1.5的包,在”a”+b+”c”时,Java内部不再使用StringBuffer来重载String’+’操作,而使用StringBuilder来代替。然而在J2me中,没有StringBuilder这个类,所以就问题就出现。解决办法,在编译时,指定JDK版本为1.4 

编译部分的脚步修改如下: Target都运行正常

        <target name="complie" depends="init" description="编译">                
        
<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打包J2meWtk更自动化一些。当然,如果只是打一个包,体现不出什么优势,如果在发布J2me程序时,要求同时打多个版本的包,那Ant的优势就体现出来了。相信有过J2me开发的朋友都有这方面的经验,发布时,由于版本太多,而各版本之间的差异可能就是键值或屏幕大小等比较细小的地方,如果使用Wtk打包,慌乱之中难免出错。使用Ant在配合一些配置文件,这样打包的过程就方便多了。

当然,使用antJ2me打包,脚本显得臃肿,很多配置需要设定。不过,没有关系,已经有人更进一步了,这就是antenna,一个基于antj2me专用打包工具。除此之外,大名鼎鼎的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 作者 陈跃峰