【问题标题】:What is the best way to compile J2ME and J2SE apps from the same codebase?从同一代码库编译 J2ME 和 J2SE 应用程序的最佳方法是什么?
【发布时间】:2014-03-26 09:12:57
【问题描述】:

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

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

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

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

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

  • 对 J2ME 和 J2SE 项目使用 Antenna 预处理器

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

    我。看起来很难设置正确
    ii.感觉有点笨拙
    iii.似乎最不坏,因为我认为自己只需要使用几个条件导入。

有没有人遇到过这种事情?一些建议将不胜感激。

【问题讨论】:

    标签: ant java-me preprocessor java


    【解决方案1】:

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

    顺便说一句.. 前段时间我也遇到过类似的情况,我对设置 3 个 Eclipse 项目、一个 J2ME、一个 J2SE 和一个通用逻辑项目(技术上也是一个 J2ME 项目)感到更自在。这有助于防止 J2ME-/J2SE-only 部分之间的类名冲突。

    【讨论】:

    • 这已被证明是对我来说最好的选择——我只需要交换 J2ME 和 J2SE 图形对象,因此我实现了一个封装该对象的接口。正如您所建议的,我还在通用代码和特定于平台的代码的每个交集处都有一个简单的界面。感谢您的建议!
    【解决方案2】:

    天线应该适用于大多数情况。为 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>
    

    希望这会有所帮助!

    【讨论】:

    • 那么您认为也可以使用 Antenna 来构建 J2SE 项目吗?有没有办法在 J2ME 项目中处理 Eclipse 中的天线样式定义?我希望在编辑时将 J2ME 代码注释掉,但据我所知 Eclipse 只能在 J2ME 项目中执行此操作。
    • 我建议您使用ant build 文件,将天线任务作为其中的目标之一,而不是依赖于Eclipse。我知道编写一个 ant 构建文件可能需要一些时间,但你只写一次,它也让你的生活变得轻松。我在编辑后的答案中发布了一个示例构建文件。
    【解决方案3】:

    我曾经做过一次,所有的 j2me 库都被我自己的假货取代了。这些伪造品会调用所有需要的 j2se lib 调用。

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

    Endresult:几乎不需要任何#ifdef 东西的源代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多