我是一名长期 C++ 程序员,Java 新手。我正在 Eclipse 中开发一个 Java Blackberry 项目。问题 - 有没有办法在项目中引入不同的配置集,然后基于这些编译稍微不同的代码?
在 Visual Studio 中,我们有项目配置和#ifdef;我知道Java中没有#ifdef,但可能是文件级别的东西?
我是一名长期 C++ 程序员,Java 新手。我正在 Eclipse 中开发一个 Java Blackberry 项目。问题 - 有没有办法在项目中引入不同的配置集,然后基于这些编译稍微不同的代码?
在 Visual Studio 中,我们有项目配置和#ifdef;我知道Java中没有#ifdef,但可能是文件级别的东西?
您可以设置“最终”字段和 ifs 以使编译器优化已编译的字节码。
...
public static final boolean myFinalVar=false;
...
if (myFinalVar) {
do something ....
....
}
如果在编译代码时“myFinalVar”为假,则“做某事....”位将从编译的类中丢失。如果您有多个条件 - 这可以稍微整理一下:将它们全部转移到另一个类(例如“Config.myFinalVar”),然后条件都可以保存在一个整洁的地方。
[其实我觉得这和之前发的“穷人的ifdef”机制是一样的。]
如果您想要专门针对 BlackBerry,BlackBerry JDE 有一个预处理器:
您可以通过更新 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
有关详细信息,请参阅指定预处理器定义
您可以管理不同的类路径,例如,在一组不同的目录中实现每个“操作”:
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
在 JDK6 中,您可以使用 Java 的 ServiceLoader 接口来完成。在这里检查。
可以称其为穷人吗ifdef
:http ://www.javapractices.com/topic/TopicAction.do?Id=64 ?
不,Java 没有该功能的完全匹配。您可以使用方面,或使用 IOC 容器来注入不同的实现类。
您可以结合使用 maven 的资源过滤 mit public static final 字段,这确实会有条件地编译。
private static final int MODE = ${mode};
...
if (MODE == ANDROID) {
//android specific code here
} else {
}
现在您需要向您的 maven pom 添加一个名为“mode”的属性,它应该与您的 ANDROID 常量具有相同的值。
java 编译器应该(!)删除 if 和 else 块,从而留下你的 android 代码。
不是 testet,所以不能保证,我更喜欢配置而不是条件编译。
您可以将m4集成到您的构建过程中,以有效地将模拟绑定到 Java 编译器前面的 C 预处理器。在“集成”步骤中挥手致意,但m4是文本处理工作的正确技术。
有几个项目为 Java 带来了对基于注释的条件编译的支持:
JPSG 中的示例:
/* with Android|Iphone platform */
class AndroidFoo {
void bar() {
/* if Android platform */
doSomething();
/* elif Iphone platform */
doSomethingElse();
/* endif */
}
}
在eclipse中你可以使用多个项目
版本 2(包含版本 2 代码)
版本 1 和版本 2 包含相同的文件,但实现不同。在 Main 你通常写例如
import org.mycustom.Version;
如果您包含 Version1/Version2 项目作为参考,它将与 Version1/Version2 项目中的 Version.java 文件一起编译。