Java 可以用ant修改源代码吗?

Java 可以用ant修改源代码吗?,java,ant,preprocessor,conditional-compilation,Java,Ant,Preprocessor,Conditional Compilation,我想在我的程序中进行条件编译。我知道,如果声明一个公共静态final布尔值,编译器将忽略未遍历的分支。在构建程序之前,是否可以让ant目标更改变量 例如,如果我有: 最终公共静态布尔窗口=false; 我想要两个ant目标:Windows和Mac。 我想要命令 蚂蚁窗 将布尔值更改为true,而 蚂蚁麦克 使变量保持原样 谢谢。您可以让Ant修改属性文件,然后您可以非常轻松地在应用程序中读取此文件:新属性(新文件输入流(“文件名”), 并使用以下命令读取属性:布尔值isWindows

我想在我的程序中进行条件编译。我知道,如果声明一个公共静态final布尔值,编译器将忽略未遍历的分支。在构建程序之前,是否可以让ant目标更改变量

例如,如果我有:


最终公共静态布尔窗口=false;

我想要两个ant目标:Windows和Mac。 我想要命令

蚂蚁窗
将布尔值更改为true,而

蚂蚁麦克
使变量保持原样


谢谢。

您可以让Ant修改属性文件,然后您可以非常轻松地在应用程序中读取此文件:
新属性(新文件输入流(“文件名”)


并使用以下命令读取属性:
布尔值isWindows=new Boolean(properties.getProperty(“windows”)


或:
字符串os=properties.getProperty(“os”)

您可以使用Ant
PropertyFile
任务来执行此操作:

编辑:如果您必须使用Ant编辑源代码文件,则可以使用另一个任务:



根据需要将代码替换为您自己的代码。有关详细信息,请参阅。

跳过ant和属性文件等,Java已经做到了这一点


使用类似System.getProperty(“os.name”)

你应该仔细阅读其他答案,看看是否有更好的解决方案。然而,Ant的任务是替换文件中的文本。例如:


属性和替换任务应该可以满足您的需要。 我同意找到一个不同的方法是一个好主意

但是,如果出于某种原因,内置任务无法满足您的需求 根据您的需要,为ant编写自定义任务非常容易。
请参见

在从Ant调用Java主程序时,还可以提供命令lind值作为参数

例如,ant-f build.xml“yourantstaskname”-Doperatingsys=“windows”

内部build.xml

<target name="YouranttaskName">
<java classname="javaclassname" fork="true" >
<arg value="${operatingsys}" />
</java>
</target> 

在java-main方法中,此参数值将以相同的顺序提供。参数[0]包含“窗口”


您可以通过考虑默认OS值来编写逻辑,因为用户可能不提供命令行参数,然后相应地设置“
布尔标志”
参数。

这真的有必要吗?为什么不在启动时从配置文件加载布尔值一次呢?考虑一下您获得了多少(运行时对非静态非最终布尔变量的计算没有实际成本),以及这对构建过程的影响。@Thilo-关键是jar中根本没有代码。属性文件并不能真正实现这一点,好主意。如果它有大量的代码,在中间的死区代码引起的离域可能在性能方面非常重要。考虑OO解决方案。为每个平台创建具有单独实现类的接口。然后只实例化相应平台的类。如果其他平台的类从未实例化,Java将不会加载这些类,因此它们不会占用内存或破坏本地化。您甚至可以在单独的jar文件中分发每个平台的类,以便选择要分发给哪些用户的部分。它被称为“源代码插装”,有一些工具允许这样做(不是Ant AFAIK,但肯定可以让Ant任务执行源代码插装)。但是,您给出的用例不是其中之一:)+1。这应该是属性,而不是在中编译。让编译器去掉未使用的代码对性能的好处可以忽略不计。我注意到您需要使用“for”。使用\“不起作用。Windows检测只是一个例子