我是一名长期从事C++编程的程序员,对Java还不太熟悉。 我正在使用Eclipse开发Java Blackberry项目。 问题是 - 是否有一种方法在项目内引入不同的配置集,然后根据这些集合编译稍微不同的代码?
在Visual Studio中,我们有项目配置和 #ifdef; 我知道Java中没有 #ifdef,但也许可以在文件级别上做些什么吗?
我是一名长期从事C++编程的程序员,对Java还不太熟悉。 我正在使用Eclipse开发Java Blackberry项目。 问题是 - 是否有一种方法在项目内引入不同的配置集,然后根据这些集合编译稍微不同的代码?
在Visual Studio中,我们有项目配置和 #ifdef; 我知道Java中没有 #ifdef,但也许可以在文件级别上做些什么吗?
...
public static final boolean myFinalVar=false;
...
if (myFinalVar) {
do something ....
....
}
您可以管理不同的类路径,例如,在一组不同的目录中实现每个“Action”:
dir1/Main.java
dir2/Action.java
dir3/Action.java
然后为每个版本使用不同的类路径。
javac -sourcepath dir1 -cp dir2 dir1/Main.java
或者
javac -sourcepath dir1 -cp dir3 dir1/Main.java
class Log { public void log(String s) { System.err.println(s);}}
和class Log { public void log(String s) {}}
。 - Pierre然后你可以在代码中做一些事情,比如:您可以通过更新Eclipse™配置文件来启用应用程序的预处理。
在C:\Program Files\Eclipse\configuration\config.ini中添加以下行:osgi.framework.extensions=net.rim.eide.preprocessing.hook。如果在构建后启用了预处理,必须从“项目”菜单中清除项目,然后再次构建项目。
//#ifdef SOMETHING
// do something here
//#else
// do something else
//#endif
有关详细信息,请参见指定预处理器定义
private static final int MODE = ${mode};
...
if (MODE == ANDROID) {
//android specific code here
} else {
}
现在您需要向Maven pom添加一个名为“mode”的属性,其值应与您的ANDROID常量相同。
Java编译器应该(!)删除if和else块,从而留下您的Android代码。
未经测试,因此不能保证,我更喜欢配置而不是条件编译。
您可以将m4集成到构建过程中,有效地在Java编译器前面添加一个类似于C预处理器的模拟器。"集成"步骤需要一些技巧,但m4是处理文本的正确技术。
有几个项目为Java带来了基于注释的条件编译支持:
JPSG中的示例:
/* with Android|Iphone platform */
class AndroidFoo {
void bar() {
/* if Android platform */
doSomething();
/* elif Iphone platform */
doSomethingElse();
/* endif */
}
}