从头开始创建一个新项目
使用新建项目向导,选择J2ME中的 J2ME Midlet Suite项来创建一个EclipseME项目。

向导的第一个界面和标准Eclipse项目的一致。 在这里,你要给出项目的名字,以及项目的位置。

在第二个界面里,你要从可用的设备定义中选择一个,用于编译、运行和调试项目。 若有必要,以后你可以在项目属性中改变这个设定。 另外,在这个界面中,你也可以改变项目的JAD文件的默认位置。 在这里指定的JAD文件必须相对于项目的根目录来创建。 以后你可以在包资源管理器中使用重构(重命名或移动)来修改JAD文件位置。

最后的界面让你可以调整源文件设置,相关的项目和类库,等等。这是Eclipse的标准设置界面。 如果你的项目需要外部的类库(比如kXML等), 只要把相应的JAR文件增加到“库”(Libraries)这个面板的列表中就可以了。 EclipseME会自动把这些JAR文件和你的class文件一起进行管理。

你完成了上面的这些步骤之后,在你的工作空间里面你就会看到类似下面的这样一个项目:

把现成项目转换为EclipseME项目
如果你有一个现成的Java项目,并希望把它转换成EclipseME项目,只要从项目的弹出菜单 中选择转换成J2ME MIDlet套件(Convert to J2ME Midlet Suite)就可以了。

当你这么做的时候,EclipseME插件会自动提示你选择设备定义,并对你的项目进行一些相应的修改。
如果把一个J2SE项目转换成EclipseME项目,那么需要从构建路径中删除J2SE的类库。 EclipseME将自动删除可以识别的类库。 如果EclipseME没能成功删除J2SE类库,那么你需要自己手动删除它们。
EclipseME同时也会自动向你的项目中加入适当的J2ME类库。 特定的类库是根据项目选择的设备定义来加入的。如果你在把项目转换到EclipseME项目之前 就使用Eclipse来进行J2ME开发,那么在你的项目构建路径中可能仍然会保留一些J2ME类库。 如果这样,你必须手动删除它们。否则可能发生问题,因为EclipseME可能会认为它们是 项目依赖的第三方类库,而错把它们打包到你的JAR文件中去。
应用描述文件(JAD)编辑器
创建了新的MIDlet套件项目之后,你可能会需要更改套件的属性。 要编辑Java应用描述文件(JAD)来修改MIDlet套件的属性。
创建新的MIDlet
创建一个新的MIDlet,只要简单的创建一个从 javax.microedition.midlet.MIDlet派生的新类就可以了。 如果你点击新建按钮并选择其它, 那么可以轻松的使用下面的选项来创建MIDlet:

或者,你也可以使用标准的新建类,并手动指定 javax.microedition.midlet.MIDlet作为基类。
在接下来的面板中,你可以设定新MIDlet子类的详细内容:

在这个对话框中,为新建的midlet类选择/填入适当的信息。 除了添加到应用描述文件(Add to Application Descriptor)这个复选框之外, 其它项目都是标准的类创建参数。
只有你使用前面描述过的创建新的J2ME Midlet(New J2ME Midlet) 这个方法来创建类的情况下, 添加到应用描述文件(Add to Application Descriptor)复选框 才会出现。 如果选中了这个参数,那么EclipseME会使用默认信息自动把新创建的midlet加入到项目的应用描述文件(JAD)中。 以后可以使用JAD编辑器来修正midlet的信息。
如果你没有选中添加到应用描述文件(Add to Application Descriptor)复选框, 或者你是手动创建的MIDlet类,那么你必须使用JAD编辑器 来输入MIDlet的详细信息使得它能够被正确的注册为MIDlet套件的一部分。 否则J2ME设备无法访问此MIDlet。
运行/调试一个MIDlet
开始之前
你必须改变一些Eclipse的默认设定以调试MIDlet。在安装文档中说明了需要进行哪些改变。 请点击这里看看你需要进行哪些改变。
快速的调试MIDlet
要对一个MIDlet进行快速调试,只要从调试(Debug)项中选择 模拟运行J2ME MIDlet (Emulated J2ME Midlet)项即可。

这样EclipseME会使用当前的默认设置来自动创建一个启动配置项,并启动调试器。
或者,你也可以使用右键点击你的MIDlet类并选择调试(Debug) 项中的模拟运行J2ME MIDlet (Emulated J2ME Midlet)项, 来使用“根据上下文启动(contextual launch)”的特性。

当你用上述两种方式之一时,就为启动MIDlet (Midlet launching)模式自动生成了启动配置。 关于不同的启动模式的进一步信息,请参见这里。
手动创建一个启动配置
你可以选择运行(Run)...或调试(Debug)...来手动 创建一个启动配置,点击左面面板中无线工具包模拟 (Wireless Toolkit Emulation), 然后按新建(New)按钮。

默认情况下,启动配置是按照无线下载模式创建的。 关于不同的启动模式的进一步信息,请参见这里。
在模拟器上调试
从Eclipse 3.0开始,就可以在J2ME模拟器自带的KVM上进行调试了。 “模拟运行J2ME MIDlet”的启动配置项也可以用于在模拟器中调试MIDlet。
注意:一般情况下,无法在“无线下载”模式下对MIDlet进行调试。
有数字签名的MIDlet
一般情况下,当你使用非OTA模式启动时,EclipseME将尝试使用verified(经过校验的类)目录下的类来运行模拟器, 而不会进行一次完整的部署过程。但某些模拟器无法在此模式下运行,而需要你的项目被完整地部署。 另外,OTA启动模式也要求项目被完整部署。
EclipseME会自动处理这些情况。由于数字签名处理是部署流程的一部分,因此如果你对MIDlet进行了数字签名, 那么,根据你对签名密码的设置,在启动过程中EclipseME可能会提示你输入密钥库密码和密钥密码。 一般情况下这只会在你把EclipseME配置为提示输入密码,并且第一次启动模拟器的时候发生。随后,EclipseME 就会把密码保存在密码中,因此直到你关闭Eclipse或改变了工作空间,EclipseME都不必再次提示你输入密码。
打包
如何把MIDlet套件打包
EclipseME是通过J2ME MIDlet套件项目的上下文菜单来提供打包支持的,请参见下面的截图。

打包选项
有两种打包选项——创建混淆包(Create Obfuscated Package) 和创建包(Create Package).
创建包
如果使用创建包,那么将把JAD和JAR文件输出到在 首选项(Preferences)中配置的部署目录中。部署的JAR文件包含 校验过的类文件和资源文件。
创建混淆包
如果使用创建混淆包,同样将把JAD和JAR文件输出到在 首选项中配置的部署目录中。 EclipseME会使用在首选项中指定的Proguard工具 来混淆部署的JAR文件。
混淆能够对你的MIDlet进行一定程度的保护。更重要的是,混淆后的包通常会更小。
为了产生混淆包,需要正确安装Proguard工具,并在 混淆首选项(Obfuscation Preferences)中正确设置其安装目录。 Proguard是一个免费、开源的工具,可以从http://proguard.sourceforge.net/ 下载。
混淆过程中的错误和警告
在混淆过程中有可能产生警告或错误。这种情况下,会弹出对话框提示是否继续打包或取消。

如果警告或错误可以安全的忽略,你可以选择继续(Continue), EclipseME会试图继续创建混淆包。根据问题的类型和严重程度,包有可能无法创建。
打包输出
部署JAR文件
EclipseME将使用下列信息来把JAR文件创建到部署目录中:- 在verified输出目录中的,经过预校验的class文件。、
- 在资源目录中的资源文件。
- 根据项目的JAD文件内容创建清单文件(manifest)。
部署JAD文件
在J2ME MIDlet套件项目根目录中的源JAD文件将被复制到部署目录中。 请在源JAD文件上进行修改,而不要对部署目录中的JAD文件进行修改,因为在打包过程中会覆盖掉部署的JAD文件。
在JAD文件的部署过程中, 会根据刚刚生成的JAR文件的实际大小来更新JAD文件的MIDlet-Jar-Size属性。
混淆包的输出
JAR和JAD文件是在MIDP兼容的设备上部署应用所必需的。在此之外,在混淆过程中还产生了一定数量的其它文件。 这些文件和生成的JAR文件、JAD文件一起,被放在部署目录中。
- *_base.jar
这个JAR文件包含混淆之前的初始包。这个文件被作为混淆处理的源。 - *_base_obf.jar
这个JAR文件包含混淆后的class文件。对这个jar文件进行预校验处理就产生了最终的混淆并校验过的JAR文件。 - pro_map.txt
这个文件包含了类中原名和混淆后的名字的对应关系。 利用这个文件,就可以使用Proguard的ReTrace命令, 来根据混淆后的追踪输出(stack trace)来重建原始的追踪输出。 - pro_seeds.txt
这个文件列出了作为混淆种子(seed)的MIDlet子类。 - proguard.cfg
这个文件包含Proguard的混淆参数设置。
使用Antenna打包
先决条件:
- Antenna库(可从http://antenna.sourceforge.net/获得)必须在 基本J2ME首选项(Basic J2ME Preferences)中正确配置。
- 在平台组件(Platform Components)中正确配置了EclipseME支持的Sun无线工具包
如果这些先决条件未获满足,就会弹出一个错误信息对话框。
从J2ME项目菜单选择“导出Antenna构建文件(Export Antenna Build Files)”来导出Antenna的构建文件。 会自动产生下列几个文件:
- build.xml - 用来进行标准Ant构建流程的根构建文件。 这个文件是包含eclipseme-build.xml文件的骨架文件。 这个文件可以修改,它不会被接下来的导出操作覆盖掉。
- eclipseme-build.xml - 这个构建文件处理对Antenna库的调用并包含所有与导出的Eclpse项目相关的类路径(classpath)信息。 这个文件不能被修改,因为它会被后面的导出操作重写。只要项目的类路径(classpath)更新了,这个文件就会被重新生成。
- eclipseme-build.properties - 这个文件包含了一些跟构建相关的位置和首选项定义。这个文件也不能被修改,它也会被后面的导出操作重写。 在此文件的同一路径内创建一个user-build.properties文件就可以覆盖这个文件里的属性。 user-build.properties中定义的属性值会覆盖掉eclipseme-build.properties中的同名属性值。
在打包过程中进行数字签名
从EclipseME 0.7.0版本开始,你可以在打包流程中对你的MIDlet套件自动进行数字签名。 经过的签名的MIDlet套件可以运行在“受信任的第三方(trusted third party)”保护域中, 而不是在“不被信任的(untrusted)”保护域中。如果你的MIDlet需要访问被保护的特性,那么进行数字签名就很重要。
为了在打包流程中对MIDlet套件进行数字签名,你要在项目属性页中选中 签署项目(Sign project)复选框。 你需要提供密钥库文件的位置,密钥库中密钥的别名,另外可选的,你也可以提供密钥库和密钥的密码。
设备管理
设备管理首选项
为了使用EclipseME,你必须至少配置一种设备定义。 EclipseME中的设备管理功能允许你有效控制对MIDlet套件和模拟器启动适用的设备定义。 这些设备定义是使用Eclipse的首选项对话框进行管理的。按下面的步骤进行设备管理:
-
选择Eclipse的窗口(Window)菜单中的首选项(Preferences)。
-
展开左面面板的J2ME选项分支并点击设备管理项。
右面的设备管理面板显示了当前已被EclipseME识别的所有设备。 在这个面板中,可以导入新设备,重新定义当前设备,以及删除设备定义。
可以在默认(Default)列中选中一个设备作为默认设备。 当创建新的MIDlet套件和新的模拟器启动配置的时候会首先使用默认设备。
导入设备
EclipseME可默认识别数种不同类型的无线工具包和其相关目录结构。 这些设备可以被自动导入EclipseME,用于定义项目和启动模拟器。
- 选择导入(Import)...
-
在接下来的对话框中,选择已知设备定义的根目录来进行搜索。
当你离开搜索目录文本框或者按下了刷新(Refresh)按钮, EclipseME就会开始在给定的目录和其所有子目录中查找设备。从EclipseME 1.5.0版本开始, 不再需要给定“精确”的目录来进行导入,因为只要它们存在于给定的目录中, EclipseME就应该可以定位到它们。只要找到设备,EclipseME就会把它显示出来。 如果你希望停止搜索,只要按下取消(Cancel)按钮。 搜索结束以后,使用复选框选中你要导入的设备定义。 最后,选择完成(Finish)按钮来结束导入流程。
如果EclipseME未能如你所愿找到设备定义,有可能是EclipseME暂时还不支持它。出现这种情况, 请向我们提交改进需求(enhancement request),来要求我们加入对这种WTK的支持。 欲知详情,参见这里。
-
当你成功的添加了设备,你会在设备管理首选项中看到导入的设备。
选择完成(Finish)以保存定义。
复制设备定义
在某些情况下,你可能发现导入的设备定义接近你的需求,但需要进行少许修改。 这种情况下,你可以使用复制(Duplicate)按钮来创建选定设备定义的 一个精确的拷贝。可以对这份复制的设备定义进行必要的修改,而不会影响原版设备定义。
注意:并不是一定要在修改之前进行复制。 如果你对导入的设备定义进行了修改并希望恢复原版,只要简单的删除设备定义并重新导入即可。
编辑设备定义
EclipseME试图识别各种开发者用得到的无线工具包。 但不幸的是,保持跟进不同的厂商和和他们五花八门的工具包结构是非常困难的。 即使EclipseME能够识别和导入一个设备定义,它仍有可能是不正确的,或不完全符合你的要求。 这时可以选择编辑(Edit)...按钮以打开编辑对话框。
这个有若干个标签面板的对话框提供了对设备定义的控制,包括模拟器运行,启动命令和设备的相关库。 当编辑对话框打开的时候,当前选定的设备定义内容就自动填充到对话框中。 所有的修改完成之后,点击对话框的确定(OK)按钮, 然后点击设备管理首选项对话框的确定(OK)按钮。
基本属性
编辑对话框的第一个标签面板显示了设备的许多属性定义。所有这些属性在一起即组成了 EclipseME的必要环境,因此进行修改的时候请务必小心。对此面板上各种属性进行配置的进一步信息, 请参见编辑设备基本属性一节。
库
编辑对话框的库(Libraries)面板允许对设备定义的库进行 选择和配置。应用本面板可以控制增减设备定义的功能特性。可以用这种方法来限制可用的API,以创建 更通用的项目。请参见编辑设备的相关库一节来了解详细信息。
高级属性
编辑对话框的属性(Properties)标签面板显示了当前选定设备的属性定义。 这些属性目前还不可以修改。
高级话题 - 把JAR文件添加到MIDlet套件
JAR文件类型
从一个J2ME项目的观点来看,有两大类可以被添加到MIDlet套件项目的JAR文件。 理解这两类JAR文件的区别是很重要的,因为它们必须被区别对待才能得到你想获得的结果。 这两类是:
-
硬件相关JAR文件
这类JAR文件向MIDlet提供与一些硬件功能交互的支持,它们是安装MIDlet的目标手机或其它移动设备硬件的一部分。 这类文件的一个例子是Bluetooth™(蓝牙)接口类。这类JAR文件是由设备制造商提供的,通常作为无线工具包的一部分或其扩展包(add-on)的形式提供。 这类JAR文件单独存在的意义在于,使J2ME开发者可以使用它们对MIDlet进行正确的编译, 且在部署后正确引用它们。你不需要把这些硬件相关JAR中的class安装到移动设备中去—— 因为它们已经在那里了。
-
应用相关JAR文件
这类JAR文件包含由你或者其他J2ME开发者编写的、将直接作为MIDlet的一部分而被打包部署到移动设备的类文件。 例如,一个你用来处理与服务器之间交换数据的XML解析库。这类JAR文件一般是从设备制造商之外的地方获取的。当然,如果你把你的代码打包成了JAR,那它也属于这类。
对它们进行区别的原因在于,EclipseME要对它们中的class文件进行不同的处理。 对于硬件相关JAR文件,EclipseME要保证这些文件中的类在构建过程中是类路径(classpath)的一部分, 这样你的MIDlet才能正确编译,但这些类绝不能被打包到你的MIDlet部署包中去。 因为这样做相当于试图覆盖移动设备中的硬件实现类的功能。这或许根本无法工作,因为首先,这种类文件很多都 包含本地代码(native code),而不能在MIDlet运行环境的“沙盒(sandbox)”中工作。 其次,一个包含本地代码的MIDlet在部署流程中应该是无法通过预校验的。最后,即使上面的情况都没有发生, 只要是自律的MIDlet容器都不会允许MIDlet覆盖系统类——它会认为MIDlet是无效的而拒绝执行。
另一方面,对于应用相关JAR文件,EclipseME则需要抽取其中的所有类和资源文件等,把它们和 MIDlet套件项目中的相应项目一起,打包到最后的部署包中。J2ME设备中并不存在J2SE和J2EE系统中的 类路径(classpath)概念。一个J2ME套件只是由两个文件组成——一个JAR文件和一个JAD文件。 因此所有你的MIDlet要用到的类和资源都必须被打包成一个单独的JAR文件。
EclipseME根据你把文件加入系统的方式以及(隐含的)jar文件的相关“导出(export)”设定来区分其分类归属。 因此下面的工作对你很重要:
- 决定JAR文件的归属分类,然后
- 用正确的方式把它加入系统。
添加硬件相关JAR文件
有两种添加硬件相关JAR的方法。可以在设备管理首选项面板中添加,也可以直接添加到项目,但不进行导出。
是用设备定义来添加硬件相关JAR文件
硬件相关JAR文件可以从设备管理首选项中作为一个新库来添加。 大部分情况下,EclipseME能够从你的无线工具包中获取所有库定义的相关信息。 如果没有的话,那么你需要首先向设备定义中添加一个新库(具体做法请参见这里)。 最后,修改你的MIDlet套件项目的属性来使用新添加的或更新过的设备定义(参见这里)。
以上步骤结束之后,JAR文件就包含到你的项目的构建路径中了,这样编译器可以找到相关类的定义, 但EclipseME不会试图把这些类添加到你的部署JAR文件中去—— 因为EclipseME知道:这个JAR文件现在是无线工具包的一部分,仅用于类引用的目的。
如果你试图在模拟器运行MIDlet的时候,特别是在OTA模式中,你得到了非法类(illegal classes) 的错误提示,这可能是一个信号:你把硬件相关JAR错误的按照应用相关JAR的方式加入了系统。
直接添加到项目
在EclipseME 0.9.4版本之前,上面的方法是添加硬件相关JAR到EclipseME的唯一方案。 从0.9.4版本开始,硬件相关JAR文件还可以直接在项目属性的“Java构建路径”中的“库”面板中直接添加。 比如,在下面的项目中,mmapi.jar已经被添加到了项目中。

但是,如果你按此方法添加JAR文件,需要你高度注意的是:在“排序和导出(Order and Export”面板中, 千万不要选中该JAR文件旁边的复选框,就像下面这样:

如果选中了复选框,那么EclipseME会试图对mmapi.jar中的内容进行 预校验并把其内容包含在输出的部署JAR文件中,这显然是错误的。
哪个方法更好?
在EclipseME 0.9.4之前,你只有一种方法添加硬件相关JAR,所以事情很简单。从0.9.4版本开始, 你有了两个选择,那么哪个更好些呢?
EclipseME的开发者认为,在绝大部分情况下,最好使用第一种方案——使用设备定义来添加硬件相关JAR文件。 这个方法使得这个改变在不同项目中获得重用, 而且更好的把硬件相关JAR文件和你的项目所使用的硬件设备相联系。 但如果因为某些原因你无法使用这个方法,那么第二种方法——添加不进行导出的JAR文件到项目——你也可以选用。
添加应用相关JAR文件
应用相关JAR文件必须像非J2ME项目中的JAR文件那样, 被加入到项目的构建路径中。选择 菜单中的 菜单项,点击左边面板的 Java构建路径(Java Build Path)项,然后在对话框的右边面板 中加入JAR文件(或类文件目录)。

就像这样,在上面的例子中,除了已经加入的硬件相关JAR文件mmapi.jar之外, 我们正在为项目加入一个应用相关JAR文件extensions.jar。
从EclipseME 0.9.4版本开始,你必须在Java构建路径中的 “排序和导出”面板中,选中所有的应用相关JAR文件旁边的复选框,像下面这样:

完成之后,JAR文件或类文件目录中的class文件就成为你的项目构建路径的一部分, 而且会被打包到项目的输出部署JAR文件中。 就像上面的例子中,EclipseME会收集extensions.jar 中的所有类和其它资源,进行预校验,然后把它们作为你的MIDlet的一部分进行打包部署。 但是,EclipseME不会如此处理mmapi.jar, 因为在“排序和导出”中,它旁边的复选框是空的。mmapi.jar中的资源 在编译时是可用的,但不会被打包部署。
如果你试图在模拟器运行MIDlet的时候,特别是在OTA模式中, 你得到了ClassNotFoundException(未找到类)异常, 这是个信号,表示相关的类未被正确打包到你的部署JAR文件中。 通常这意味着你没有正确的把应用相关JAR文件添加到项目的Java构建路径中, 或者是忘记选中“导出”复选框了。
模拟器说明
如果你正在使用一些特殊特性,比如蓝牙、视频等,你可能会处于这样一种境地: 你按照上面的方法正确的添加了硬件相关JAR,你的应用程序也可以正确的编译, 但是在模拟器中运行的时候,硬件功能却似乎并不工作。
这种情况下唯一的可能性就是,这并非EclipseME的问题——而很可能是J2ME模拟器的问题。 在很多情况下,无线工具包的模拟器对硬件特性的支持仅限于正确载入MIDlet, 而不包含对物理设备硬件特性的真实模拟。不幸的是,对这种情况我们也无能为力。
为WTK库连接文档(Javadoc)或源代码
从EclipseME 0.9.0版本开始,你可以向无线工具包(WTK)的库添加Javadoc或源代码的连接。 这样你可以进行源码级别的调试(如果编译的WTK中包含调试信息的话), 并且可以使用Eclipse的上下文敏感API帮助功能。
为WTK库连接源码或Javadoc
为了向WTK组件连接Javadoc,请进行如下步骤:
- 选择J2ME分支, 然后点击设备管理(Device Management),打开设备管理器窗口。 菜单的 , 点开左面的
- 选择你要添加源码和/或Javadoc的设备,然后点击编辑(Edit)...按钮。
- 点击Javadoc或源码(Source)单元格以进入编辑模式。
- 点击单元格编辑器的按钮以打开适当的编辑器对话框。
- 连接源代码,请使用弹出的源代码连接配置对话框。
- 连接Javadoc,请使用弹出的Javadoc连接配置对话框。
- 连接源代码,请使用弹出的源代码连接配置对话框。
注意并非所有的无线工具包的JAR文件都是使用包含调试信息的方式编译的。 因此,即使你已经给JAR文件和源代码建立连接,你可能仍然无法在调试中跳入WTK源代码。
相关链接
下载在Sourceforge上的项目主页