我想在我的程序中进行条件编译。我知道如果你声明一个public static final boolean,编译器将忽略未遍历的分支。在构建程序之前,是否可以让ant目标更改变量?
例如,如果我有:
final public static boolean windows = false;
我想要两个蚂蚁目标:Windows和Mac。
我想要这个命令
ant windows
将布尔值更改为true,同时
ant mac
将变量保留原样。
感谢。
答案 0 :(得分:11)
您可以让Ant修改属性文件,然后您可以非常轻松地在应用程序中阅读此文件:
new Properties(new FileInputStream("filename" / new File(filename))
),
并使用以下方式阅读属性:
Boolean isWindows = new Boolean(properties.getProperty("windows"))
或:
String os = properties.getProperty("os")
。
您可以使用Ant PropertyFile
任务执行此操作:http://ant.apache.org/manual/Tasks/propertyfile.html。
编辑:如果您绝对必须使用Ant编辑源代码文件,则可以使用其他任务:
<replaceregexp file="blah.java" match="public static final boolean WINDOWS = \"(.*)\"" replace="public static final boolean WINDOWS = \"" + ${properties.windows} + "\"" />
- 根据需要将代码替换为您自己的代码。有关详细信息,请参阅http://ant.apache.org/manual/Tasks/replaceregexp.html。
答案 1 :(得分:1)
跳过ant和属性文件等,Java已经这样做了!
使用类似System.getProperty(“os.name”);
的内容答案 2 :(得分:1)
您应仔细阅读其他答案,看看是否有更好的解决方案。但是,Ant确实需要替换文件中的文本。例如:
&lt; replace file =“$ {src} /MyFile.java”token =“boolean windows = true”value =“boolean windows = false”/&gt;
答案 3 :(得分:1)
属性和替换任务应该可以满足您的需求。 我同意找到一种不同的方法是一个好主意。
但是,如果由于某种原因,内置任务不会得到你 你需要什么,为ant编写自定义任务非常容易。 见http://ant.apache.org/manual/develop.html
答案 4 :(得分:0)
您还可以在从Ant调用Java主程序时提供command-lind值作为参数。
例如。 ant -f build.xml "YouranttaskName" -Doperatingsys="windows"
内部build.xml
<target name="YouranttaskName">
<java classname="javaclassname" fork="true" >
<arg value="${operatingsys}" />
</java>
</target>
在java -main方法中,这个参数值将以相同的顺序提供.i.e。 args [0]包含“Windows”。
您可以通过考虑您的默认操作系统值来编写逻辑,因为用户可能不会提供命令行参数,然后相应地设置“boolean flag'
参数。”