【问题标题】:Is it possible to modify source code with ant?可以用ant修改源代码吗?
【发布时间】:2011-01-21 06:48:17
【问题描述】:

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

例如,如果我有:

final public static boolean windows = false;

我想要两个 ant 目标:Windows 和 Mac。 我想要命令 ant windows 将布尔值更改为真,同时 ant mac 保持变量不变。

谢谢。

【问题讨论】:

  • 这真的有必要吗?为什么不在启动时从配置文件中加载一次布尔值?考虑一下您获得了多少(在运行时评估非静态非最终布尔变量没有实际成本),以及这对您的构建过程的影响。
  • @Thilo - 关键是 jar 中根本没有代码。属性文件并没有真正实现这一点,不过是个好主意。
  • 如果是大量代码,中间的死代码导致的离域在性能方面可能非常显着。
  • 考虑 OO 解决方案。为每个平台创建一个具有单独实现类的接口。然后只实例化相应平台的类。如果它们从未实例化,Java 将不会加载其他平台的类,因此它们不会占用内存或破坏本地化。您甚至可以将每个平台的类分发到单独的 jar 文件中,以便您可以选择将哪些部分分发给哪些用户。
  • 您想要做的事情有有效的案例。它被称为“源代码检测”,并且有允许这样做的工具(不是 Ant AFAIK,但肯定可以使用 Ant 任务来执行源代码检测)。但是您提供的用例不是其中之一:)

标签: java ant preprocessor conditional-compilation


【解决方案1】:

你可以让 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。这应该是属性,而不是编译进去的。让编译器去除未使用的代码的性能优势可以忽略不计。
  • 我注意到你需要使用 "对于“。使用\”不起作用。
【解决方案2】:

跳过 ant 和属性文件等,Java 已经这样做了!

使用类似 System.getProperty("os.name");

【讨论】:

  • Windows 检测只是一个例子
【解决方案3】:

您应该仔细阅读其他答案,看看是否有更适合您的解决方案。但是,Ant 确实有一个任务是替换文件中的文本。例如:

【讨论】:

    【解决方案4】:

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

    但是,如果由于某种原因内置任务无法满足您的需求 您需要什么,为 ant 编写自定义任务非常容易。 见http://ant.apache.org/manual/develop.html

    【讨论】:

      【解决方案5】:

      您还可以在从 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' 参数。

      【讨论】:

        猜你喜欢
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 2020-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        相关资源
        最近更新 更多