我想在我的程序中进行条件编译。我知道,如果您声明一个公共静态最终布尔值,编译器将忽略未遍历的分支。是否可以在构建程序之前让 ant 目标更改变量?
例如,如果我有:
final public static boolean windows = false;
我想要两个 ant 目标:Windows 和 Mac。我希望命令
ant windows
将布尔值更改为 true,同时
ant mac
保持变量不变。
谢谢。
我想在我的程序中进行条件编译。我知道,如果您声明一个公共静态最终布尔值,编译器将忽略未遍历的分支。是否可以在构建程序之前让 ant 目标更改变量?
例如,如果我有:
final public static boolean windows = false;
我想要两个 ant 目标:Windows 和 Mac。我希望命令
ant windows
将布尔值更改为 true,同时
ant mac
保持变量不变。
谢谢。
你可以让 Ant 修改一个属性文件,然后你可以很容易地在你的应用程序中读取这个文件:)new Properties(new FileInputStream("filename" / new File(filename))
,并使用:或:
读取属性。Boolean isWindows = new Boolean(properties.getProperty("windows"))
String os = properties.getProperty("os")
您可以使用 AntPropertyFile
任务来执行此操作: 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。
您应该仔细阅读其他答案,看看是否有更好的解决方案适合您。但是,Ant 确实有一个任务是替换文件中的文本。例如:
<replace file="${src}/MyFile.java" token="boolean windows=true" value="boolean windows=false"/>
跳过 ant 和属性文件等,Java 已经这样做了!
使用类似 System.getProperty("os.name");
属性和替换任务应该可以满足您的需求。我同意找到不同的方法是个好主意。
但是,如果由于某种原因内置任务无法满足您的需求,那么为 ant 编写自定义任务非常容易。见http://ant.apache.org/manual/develop.html
您还可以在从 Ant 调用 Java 主程序时提供命令行值作为参数。
例如。ant -f build.xml "YouranttaskName" -Doperatingsys="windows"
在 build.xml 里面
<target name="YouranttaskName">
<java classname="javaclassname" fork="true" >
<arg value="${operatingsys}" />
</java>
</target>
在 java -main 方法中,此参数值将以相同的顺序可用。即 args[0] 包含“Windows”。
您可以通过考虑您的默认操作系统值是什么来编写您的逻辑,因为用户可能不提供命令行参数,然后boolean flag'
相应地设置 ' 参数。