从同一代码库编译J2ME和J2SE应用程序的最佳方法是什么?

时间:2009-08-17 21:36:43

标签: ant java-me preprocessor java

我正在尝试为J2ME和J2SE构建一个应用程序。演示代码显然会有所不同,但我希望尽可能保持逻辑通用。

我的计划是使用Ant或Antenna的预处理器来选择J2ME或J2SE Graphics对象,该类是我的逻辑和显示代码之间的唯一交集。我需要的是在Ant / Antenna构建任务期间在一些文件中交换一行或两行导入。

我想了解如何设置这个设置。

我目前有两个Eclipse项目,一个J2ME和一个J2SE。我对如何设置预处理器有几点想法:

  • 将J2SE代码作为默认代码,并且仅预处理J2SE代码以交换J2SE特定的导入
  • 对J2ME和J2SE项目使用Antenna预处理器
  • 使用Ant文本替换进行必要的源修改

    我。看起来很难设置正确的
    II。感觉有点kludgy
    III。看起来最不好,因为我认为自己不需要使用多少条件导入。

有没有人有这种经历?一些建议将不胜感激。

3 个答案:

答案 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东西