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

Ant 从同一代码库编译J2ME和J2SE应用程序的最佳方法是什么?,ant,java-me,preprocessor,java,Ant,Java Me,Preprocessor,Java,我正在尝试为J2ME和J2SE构建一个应用程序。表示代码显然会有所不同,但我希望尽可能保持逻辑的通用性 我的计划是使用Ant或Antenna的预处理器选择J2ME或J2SE图形对象,该类是我的逻辑和显示代码之间的唯一交集。在我的Ant/Antenna构建任务期间,我只需要在几个文件中交换一行或两行导入 我想要一些关于如何设置的建议 我目前有两个Eclipse项目,一个J2ME和一个J2SE。对于如何设置预处理器,我有一些想法: 将J2SE代码设置为默认值,并且只预处理J2SE代码以在特定于J2S

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

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

我想要一些关于如何设置的建议

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

将J2SE代码设置为默认值,并且只预处理J2SE代码以在特定于J2SE的导入中交换

对J2ME和J2SE项目都使用天线预处理器

使用Ant文本替换进行必要的源代码修改

一,。看起来很难正确设置 二,。感觉有点笨拙 看起来最不坏,因为我认为我自己永远不需要使用比几个有条件的导入更多的东西


有人有过这种经历吗?如果您能提供一些建议,我们将不胜感激。

天线在大多数情况下都可以。对J2SE和J2ME都使用单一源代码的优点是,您不必维护源代码,而且还可以消除bug潜入的可能性。我也有类似的问题,但我必须编写一个适合我需要的自定义预处理器。但在大多数情况下,天线做得很好

已编辑:示例生成文件

<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>

希望这有帮助

两个应用程序版本的启动方式不同,对吗?一次是一个MIDlet,另一次是一个带有静态main方法的Java类。在这种情况下,我不认为需要使用预处理。两种启动实现都可以访问公共代码库,并移交J2ME或J2SE图形对象,该对象实现公共代码库已知的接口。这样,公共代码库就不需要知道实现细节,只需要表示部分的接口


顺便说一句。。不久前我也遇到过类似的情况,我对设置3个Eclipse项目感到更舒服,一个J2ME、一个J2SE和一个公共逻辑项目,从技术上讲也是一个J2ME项目。这有助于防止仅J2ME-/J2SE部分之间的类名冲突。

我曾经这样做过,所有J2ME库都被我自己的赝品所取代。这些赝品将调用所有需要的j2se库调用

听起来需要做很多工作,但实际上很多调用都是类似的,而且您可能没有使用所有的东西,所以您只需要创建可用j2me类的一小部分


最终结果:几乎不需要任何ifdef内容的源代码

,所以您认为使用天线也可以构建J2SE项目?有没有办法在J2ME项目中处理Eclipse中定义的天线样式?我希望在编辑J2ME代码时将其注释掉,但据我所知,Eclipse只能在J2ME项目中进行注释。我建议您使用ant构建文件,将天线任务作为其中的一个目标,而不是依赖于Eclipse。我知道编写一个ant构建文件可能需要一些时间,但您只需编写一次,这也让您的生活变得轻松。我在编辑后的答案中发布了一个示例构建文件。这被证明是我的最佳选择-我只需要交换J2ME和J2SE图形对象,所以我实现了一个包装该对象的接口。正如您所建议的,我在公共代码和特定于平台的代码的每个交叉点上都有一个简单的接口。谢谢你的建议!