条件Java编译

时间:2009-12-17 15:29:52

标签: java eclipse conditional-compilation

我是一位长期从事Java的程序员。我正在Eclipse中开发一个Java Blackberry项目。问题 - 有没有办法在项目中引入不同的配置集,然后根据这些设置编译略有不同的代码?

在Visual Studio中,我们有项目配置和#ifdef;我知道Java中没有#ifdef,但可能是文件级别的东西?

11 个答案:

答案 0 :(得分:15)

您可以设置'final'字段和ifs以使编译器优化编译的字节码。

...
public static final boolean myFinalVar=false;
...
if (myFinalVar) { 
 do something ....
 ....
}

如果编译代码时'myFinalVar'为false,那么编译后的类将会遗漏'do something ....'位。如果您有多个条件 - 可以稍微整理一下:将它们全部转移到另一个类(比如'Config.myFinalVar')然后条件都可以保存在一个整洁的地方。

'Hardcore Java'.

中描述了这种机制

[其实我认为这与早先发布的“穷人的ifdef”机制相同。]

答案 1 :(得分:6)

您可以管理不同的类路径,例如,在一组不同的目录中实现每个“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

答案 2 :(得分:6)

如果你想专门用于BlackBerry,BlackBerry JDE有a pre-processor

  

您   可以启用您的预处理   更新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

有关详细信息,请参阅Specifying preprocessor defines

答案 3 :(得分:5)

在JDK6中,您可以使用Java的ServiceLoader接口来完成。 检查here

答案 4 :(得分:4)

可以打电话给穷人ifdefhttp://www.javapractices.com/topic/TopicAction.do?Id=64吗?

答案 5 :(得分:3)

不,Java与该功能没有完全匹配。您可以使用方面,或使用IOC容器注入不同的实现类。

答案 6 :(得分:1)

您可以在组合mit公共静态最终字段中使用maven的资源过滤,这将确实有条件地进行编译。

private static final int MODE = ${mode};

...

if (MODE == ANDROID) {
    //android specific code here
} else {

}

现在你需要为你的maven pom添加一个名为“mode”的属性,这应该是 与您的ANDROID常量相同的值。

java编译器应该(!)删除if和else块,从而留下你的android代码。

不是testet,所以不能保证我更喜欢配置而不是条件编译。

答案 7 :(得分:1)

您可以将m4集成到构建过程中,以便有效地将模拟带到Java编译器前面的C预处理器。 “整合”步骤中有许多挥手,但 m4 是文本处理工作的正确技术。

答案 8 :(得分:1)

除了Maven,Ant和其他提供类似功能的构建工具之外,我们宁愿在Java中构建接口并在运行时切换实现。
有关详细信息,请参阅Strategy Pattern

与C / C ++相反,这不会带来很大的性能,因为Javas JIT编译器在运行时进行了优化,并且能够在大多数情况下内联这种模式。
这种模式的最大优点是灵活性 - 您可以在不触及核心类的情况下更改底层实现。

您还应该检查IoCObserver Pattern以获取更多详细信息。

答案 9 :(得分:1)

有两个项目为Java提供了对基于注释的条件编译的支持:

JPSG中的示例:

<CharCountInput
  onChange={this.handleChange}
  value={this.state.title}
  type="text"
  maxChars={150}
  name="title"
  placeholder="Enter text here..."
/>

答案 10 :(得分:0)

在eclipse中你可以使用多个项目

  • Main(包含公共代码)
  • 版本1(包含版本1代码)
  • 版本2(包含版本2代码)

    1. 主要 - &gt;选择Project-&gt; Properties-&gt; Java Build Path-&gt; Projects选项卡
    2. 选择添加...
    3. 添加“Version1”xor“Version2”并确定返回工作区。

版本1和版本2包含相同的文件但实现不同。在Main中你通常会写例如。

import org.mycustom.Version;

如果您将Version1 / Version2项目作为参考包含在内,它将使用Version1 / Version2项目中的Version.java文件进行编译。