如何找到正在执行的蚂蚁目标的名称?

时间:2010-07-02 11:29:41

标签: java ant

如果蚂蚁的目标名称包含某些单词,我想设置一些变量。这可能吗?我可以获得当前执行目标的名称吗?

编辑:我尝试使用-d运行ant,我注意到环境变量TEMP_A似乎保留了当前目标的名称。我想知道,这会在不同的蚂蚁版本中发挥作用吗?

4 个答案:

答案 0 :(得分:3)

您可以使用内置(自JDK 6)Javascript引擎创建一个macrodef,不需要额外的库。
类似的东西:

<project>
<!--
  Loglevel defined in org.apache.tools.ant.Project
  MSG_ERR = 0;
  MSG_WARN = 1;
  MSG_INFO = 2;
  MSG_VERBOSE = 3;
  MSG_DEBUG = 4;
-->

<!-- macrodef creating a property with name of executing target
 optional logging to stdout via adjustable loglevel -->
<macrodef name="showtargetname">
<attribute name="property"/>
<attribute name="loglevel" default="3"/>
<sequential>
 <script language="javascript">
   t = self.getOwningTarget();
   self.getProject().setNewProperty("@{property}", t);
   self.log("TargetName => " + t, @{loglevel});
  </script>
</sequential>
</macrodef>

<target name="foobar">
 <showtargetname property="foo"/>
 <echo>$${foo} => ${foo}</echo>
</target>

</project>

之后,您将目标名称作为进一步处理的属性,即f.e。使用condition task(=&gt; contains)检查属性是否包含某些字符串 或者,也可以将“targetname包含某些字符串”的逻辑添加到macrodef中。

要探索可供自己使用的内容,请使用:

<script language="javascript">
 for(x in self) {self.log(x);}
</script>

答案 1 :(得分:2)

如果您在构建过程中需要该信息,那么您应始终能够确定目标名称,因为大多数情况下您目标中。因此,可以向目标主体添加一行代码,根据名称设置属性。那将是纯粹的手工方法。

也许您想要某种通用(自定义)任务,比如可以复制到任何目标的一行代码并确定当前目标名称。我不知道提供此名称的内置属性。但是,如果您编写自定义任务和子类org.apache.tools.ant.Task,那么您可以获取“父”目标的名称并构建属性。

(如果apache在网上发布了API,那么我就能给出更准确的答案......)

修改

从外面可以实现。可以实现一个监听器并将其附加到ant。因此,当输入目标时,听众将收到通知。但问题可能是改变“内部”蚂蚁的财产。我实际上并不知道这个监听器是否与ant线程存在于同一个VM中。

答案 2 :(得分:1)

当前执行目标名称没有内置属性。这显然是设计上的;该属性存在于早期版本的Ant中,但已被删除以避免可能的滥用。

查看此问题:Print/Access the Name of the Currently Executing Ant Target

另请参阅Ant创建者在此电子邮件主题中的讨论:link text

答案 3 :(得分:0)

另一种方法是通过JavaScript与Java Reflection。 您可以在ant构建文件中包含以下scriptdef。 然后将<currentTarget/>放在任何目标中以显示名称。 显然,这是一个简单的例子,但它可以以其他方式使用。

<scriptdef name="currentTarget" language="javascript">
  java.lang.System.out.println(project.getThreadTask(java.lang.Thread.currentThread()).getOwningTarget());
</scriptdef>