如果我通过执行将变量传递给 ant
ant -Dsomething=blah
如何在我的 build.xml 中引用它?我尝试了@something@和${something}但似乎都不起作用。
最终我要做的是在编译时设置一些属性(版本)。
更新:问题当然出在其他地方-接受带有示例的最完整的答案
如果我通过执行将变量传递给 ant
ant -Dsomething=blah
如何在我的 build.xml 中引用它?我尝试了@something@和${something}但似乎都不起作用。
最终我要做的是在编译时设置一些属性(版本)。
更新:问题当然出在其他地方-接受带有示例的最完整的答案
当你过度思考这些事情时,你不讨厌它:
<project name="test">
<echo message="The value of foo is ${foo}"/>
</project>
现在,我将运行我的程序。请注意,我从未foo
在我的build.xml
. 相反,我将从命令行获取它:
$ ant -Dfoo=BAR_BAR_FOO
test:
[echo] The value of foo is BAR_BAR_FOO
BUILD SUCCESSFUL
time: 0 seconds
看。没有什么特别的。您将在命令行上设置的属性视为普通属性。
这就是有趣的地方。请注意,我foo
在build.xml
这一次定义了属性:
<project name="test">
<property name="foo" value="barfu"/>
<echo message="The value of foo is ${foo}"/>
</project>
现在观看乐趣:
$ ant
test:
[echo] The value of foo is barfu
BUILD SUCCESSFUL
time: 0 seconds
现在,我们将foo
在命令行上设置属性:
$ ant -Dfoo=BAR_BAR_FOO
test:
[echo] The value of foo is BAR_BAR_FOO
BUILD SUCCESSFUL
time: 0 seconds
请参阅命令行覆盖了我在build.xml
文件本身中设置的值。这样,您可以拥有可以被命令行参数覆盖的默认值。
听起来您想要执行以下操作:
<mkdir dir="build/src"/>
<copy todir="build/src" overwrite="true">
<fileset dir="src" includes="**/*.java"/>
<filterset>
<filter token="VERSION" value="${version}"/>
</filterset>
</copy>
...这将导致您的源被复制,替换@VERSION@
:
public class a { public static final String VERSION = "@VERSION@"; }
...然后包含build/src
在您的javac
src 中。
也就是说,我不推荐这种方法,因为源复制步骤很昂贵,而且无疑会引起混乱。过去,我在我的包中存储了一个 version.properties 文件version=x.y
。在我的 Java 代码中,我使用了Class.getResourceAsStream("version.properties")
和java.util.Properties
. 在我的 build.xml 中,我使用<property file="my/pkg/version.properties"/>
了这样我可以创建一个output-${version}.jar
.