Java Ant:多次替换源文件中的令牌

Java Ant:多次替换源文件中的令牌,java,eclipse,ant,properties,build,Java,Eclipse,Ant,Properties,Build,我有一个带有常量的Java配置文件 我使用ant根据构建替换常量的值。在预编译目标中: <replace file="Config.java" value="default" propertyFile="${build.env}.properties"> <replacefilter token="@mytoken@" property="myprop.x"/> </replace> 效果很好。但是在我运行这

我有一个带有常量的Java配置文件

我使用ant根据构建替换常量的值。在预编译目标中:

<replace 
    file="Config.java"
    value="default"
    propertyFile="${build.env}.properties">
<replacefilter 
    token="@mytoken@" 
    property="myprop.x"/>
</replace>

效果很好。但是在我运行这个之后,我的源文件被修改了。因此,如果我再次运行它,它将不会替换任何内容,因为@mytoken@是第一次被替换的

我不想把Config.java放在项目之外,因为我希望它能与eclipse一起工作,如果文件不在预期的位置,就会出现很多编译错误

我正在考虑在构建后的目标中替换回去,但不确定这是否安全。如果构建失败或用户中断脚本,它将不会运行,并且不会设置回值


有什么帮助吗?提前谢谢。

当我不得不处理这项任务时,我用了另一种方式。ant脚本总是生成一个名为
Version.java
的文件,而不是编辑真正的源文件<代码>版本.java从未签入存储库,但接口
Version
实现是。这样,您就不必静态地依赖于生成的文件的存在

public String getVersionHelper() {
  try {
    Class versionClass = Class.forName("Version");
    IVersion version = (IVersion) versionClass.newInstance() 
    return version.getVersion();
  } catch (ClassNotFoundException ex) {
    return "NO VERSION";
  }
}

关键的一点是,正式的构建总是使用ant完成的,而不是eclipse。这允许您在eclipse中运行以进行测试,并且仍然能够成功编译。

最好的解决方案是在单独的临时位置运行构建,而不是在eclipse项目中。您的意思是复制项目并在那里运行脚本?这主意不错,而且可以写成剧本。是的,我就是这个意思。通常从源存储库中的空构建文件夹中检索,build and cleanup。这是一个有趣的想法,但我更喜欢rsp的建议(请参阅我文章的评论),这让我制作了一个脚本来复制项目并在副本中运行构建。你的想法增加了项目的复杂性。