我正在尝试为J2ME和J2SE构建一个应用程序。演示代码显然会有所不同,但我希望尽可能保持逻辑通用。
我的计划是使用Ant或Antenna的预处理器来选择J2ME或J2SE Graphics对象,该类是我的逻辑和显示代码之间的唯一交集。我需要的是在Ant / Antenna构建任务期间在一些文件中交换一行或两行导入。
我想了解如何设置这个设置。
我目前有两个Eclipse项目,一个J2ME和一个J2SE。我对如何设置预处理器有几点想法:
使用Ant文本替换进行必要的源修改
我。看起来很难设置正确的
II。感觉有点kludgy
III。看起来最不好,因为我认为自己不需要使用多少条件导入。
有没有人有这种经历?一些建议将不胜感激。
答案 0 :(得分:3)
两个应用版本都有不同的启动方式,对吧?有一次它是一个MIDlet,另一次是一个带有静态main方法的Java类。在那种情况下,我没有看到使用预处理的要求。两个启动实现都可以访问公共代码库并移交J2ME或J2SE“graphics”对象,该对象实现公共代码库已知的接口。这样,公共代码库不需要知道实现细节,只需要表示部分的接口。
BTW ..前段时间我有类似的情况,我觉得设置3个Eclipse项目,J2ME,J2SE和一个通用逻辑项目(技术上也是一个J2ME项目)更为舒服。这有助于防止仅J2ME- / J2SE部分之间的类名冲突。答案 1 :(得分:1)
天线应该适用于大多数情况。为J2SE和J2ME使用单一源代码的优点是,您可以从源代码的维护中获得保存,并且还可以消除错误蔓延的可能性。我也有类似的问题,但我必须编写一个适合的自定义预处理器我的需要。但是对于大多数用途来说,天线可以很好地完成工作
已编辑:示例构建文件
<project name="SomeProject" default="buildJ2ME" basedir="..">
...
...
...
<taskdef name="jadUpdater" classname="net.jxta.j2me.tools.Jad" classpath="${lib.dir}/jxta-tools.jar"/>
<taskdef resource="proguard/ant/task.properties" classpath="${lib.dir}/proguard.jar" />
<taskdef resource="antenna.properties" classpath="${lib.dir}/antenna-bin-1.0.2.jar" />
<macrodef name="preprocess">
<attribute name="source"/>
<attribute name="dest"/>
<attribute name="symbols"/>
<sequential>
<wtkpreprocess
version="2"
srcdir="@{source}"
destdir="@{dest}"
symbols="@{symbols}"
printsymbols="true">
</wtkpreprocess>
</sequential>
</macrodef>
<target name="compile" depends="init">
<copy todir="${temp.dir}/src" >
<fileset dir="${src.dir}"/>
</copy>
<preprocess source="${temp.dir}/src" dest="${temp.dir}/preprocessed" symbols="${symbols}"/>
<javac srcdir="${temp.dir}/preprocessed"
destdir="${temp.dir}/classes"
bootclasspath="${bootclasspath}"
classpath="${lib.dir}"
debug="off"
source="1.3"
target="1.1" />
<antcall target="jarForObfuscate"/>
</target>
<target name="buildJ2ME" depends="clean">
<property name="symbols" value="J2ME1,J2ME2"/>
<antcall target="compile"/>
</target>
<target name="buildJ2SE">
<property name="symbols" value="J2SE1,J2SE2"/>
<antcall target="compile"/>
</target>
...
...
...
</project>
希望这有帮助!
答案 2 :(得分:0)
我已经完成了一次,所有的j2me库都被我自己的假货取代了。这些假货会调用所有需要的j2se lib调用。
听起来很多工作,但实际上很多调用是相似的,你可能没有使用所有东西所以你只需要创建一小部分可用的j2me类
Endresult:源代码几乎不需要任何#ifdef东西