Java(Eclipse)- 条件编译

4

我有一个Java项目,它被j2me项目和Android项目引用。 在这个项目中,我想使用条件编译。

类似于...

//#if android
...
//#endif

//if j2me
...
//#endif

我一直在阅读相关内容,但是目前还没有找到有用的信息。


你真的能够开发一个适用于Android和J2ME的应用程序吗? - Vladimir Ivanov
可能是条件Java编译的重复问题。 - Andreas Dolk
不是一个应用适用于两个平台...我有一个核心项目,被J2ME和Android应用所引用。 - no9
3个回答

8
您可以使用天线(有一个适用于Eclipse的插件,您可以将其与Ant构建系统一起使用)。我按照您描述的方式在我的项目中使用它,它完美地工作 :)
编辑:这里是与@WhiteFang34解决方案相关的示例,这是一种可行的方法:
在您的核心项目中:
//base class Base.java
public abstract class Base {
    public static Base getInstance() 
    {
        //#ifdef ANDROID
        return new AndroidBaseImpl();
        //#elif J2ME
        return new J2MEBaseImpl();
        //#endif
    }

    public abstract void doSomething();
}

//Android specific implementation AndroidBaseImpl.java
//#ifdef ANDROID
public class AndroidBaseImpl extends Base {
    public void doSomething() {
     //Android code
    }
}
//#endif

//J2ME specific implementation J2MEBaseImpl.java
//#ifdef J2ME
public class J2MEBaseImpl extends Base {
    public void doSomething() {
        // J2Me code
    }
}
//#endif

在使用核心项目的项目中:
public class App {

    public void something {
        // Depends on the preprocessor symbol you used to build a project
        Base.getInstance().doSomething();
    }
}

如果你想为Android构建,只需定义ANDROID预处理器符号,或者如果你想为J2ME平台进行构建,则定义J2ME。不管怎样,希望能对你有所帮助 :)

我测试过了,它运行得很好。在一个单一的项目中。我想要的是在核心基础代码中有条件IF语句,这些代码被J2ME和Android项目引用。我该怎么做呢?希望你能理解我的意思... - no9
哦,我现在明白了...你可以将天线与Ant构建系统结合使用,然后在构建脚本中为特定目标定义类似于USE_ANDROID的内容,这将导致重新构建/预处理基础项目以使用Android特定代码。 - sinek
谢谢兄弟,听起来不错。如果您能想到任何样例,请指教...我还是Java新手,对于有些人来说很基础的东西我还是有点困难的 ;) - no9
非常感谢您抽出时间为我提供这个示例。我理解其中的逻辑,只是希望在构建时有一种方法让核心项目“知道”谁在引用它。所以,在核心项目中切换定义是唯一的方法,对吗? - no9
还有一个问题……我能否实现两个核心项目(一个针对J2ME,一个针对Android),在每个项目中定义目标,并将文件链接到核心项目中,以便Ant根据目标设备进行编译? - no9

5

也许你应该考虑创建与特定配置文件(J2ME、Android或将来的其他配置文件)相关的逻辑接口。然后为每个配置文件创建具体的接口实现。任何通用部分都可以拆分成一个抽象基类,供两个实现扩展使用。这样,每个配置文件的逻辑都可以很好地分离出不同的关注点。对于每个配置文件,只需构建适当的类集合(例如,您可以按包进行分离)。从长远来看,这将更容易维护、调试、测试和理解。


这是一个有趣的解决方案。我会考虑一下。我习惯在C#中使用#pragma cc,所以我认为在Java中应该类似(我是Java新手)。我读到可以用ANT和WWYT实现这个功能,但我没有找到任何使用的优缺点... - no9
也许有人可以演示一下我如何使用ANT来完成这个任务?我已经在Eclipse中安装了ANT插件,想要进行一个简单的测试...在我的核心库中有一个字符串类型的属性,如果我运行J2ME或Android项目,我想获取某个特定值。 - no9
+1 这就是我建议使用 Ant 构建系统和 Antenna 时所考虑的。 - sinek

0

Eclipse MTJ 项目提供预处理支持,如文档所述。该支持的主要目标是解决 JavaME 上的碎片化问题。我尚未测试过与 Android 工具集一起使用的预处理支持,但它可能有效。


谢谢Gorkem。我可能会使用天线,但也会研究一下你的建议。 - no9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接