Java 如何找到正在执行的ant目标的名称?

Java 如何找到正在执行的ant目标的名称?,java,ant,Java,Ant,假设我想设置一些变量,如果蚂蚁目标的名称包含某些单词。这可能吗?我可以获取当前执行目标的名称吗 编辑:我试着用-d运行ant,我注意到一个环境变量TEMP\u A,它似乎保存着当前目标的名称。我想知道,这是否适用于不同的ant版本?如果您在构建过程中需要这些信息,那么您应该始终能够确定目标名称,因为大部分时间您都在目标内部。因此,可以向目标主体添加一行代码,根据名称设置属性。这将是纯手工方法 也许您需要某种常规(自定义)任务,比如一行可以复制到任何目标并确定当前目标名称的代码。我不知道有哪个内置

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


编辑:我试着用
-d
运行ant,我注意到一个环境变量
TEMP\u A
,它似乎保存着当前目标的名称。我想知道,这是否适用于不同的ant版本?

如果您在构建过程中需要这些信息,那么您应该始终能够确定目标名称,因为大部分时间您都在目标内部。因此,可以向目标主体添加一行代码,根据名称设置属性。这将是纯手工方法

也许您需要某种常规(自定义)任务,比如一行可以复制到任何目标并确定当前目标名称的代码。我不知道有哪个内置属性提供了这个名称。但是如果您编写一个自定义任务和子类
org.apache.tools.ant.task
,那么您就可以获得“父”目标的名称并构建属性

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

编辑


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

当前正在执行的目标名称没有内置属性。这显然是故意的;该财产存在于Ant的早期版本中,但被移除以避免潜在的滥用

看看这个问题:


另外,请参阅Ant创建者在这封电子邮件中的讨论:

另一种方法是通过JavaScript和Java反射。 您可以在ant构建文件中包含以下scriptdef。 然后只需将
放置在任何目标中即可显示名称。 显然,这是一个简单的例子,但它可以用在其他方面

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

println(project.getThreadTask(java.lang.Thread.currentThread()).getOwningTarget());

您可以使用内置(自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>

(=>contains)检查属性是否包含某些字符串。
或者,将“targetname包含某些字符串”的逻辑也添加到宏定义中。

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

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

对于(self中的x){self.log(x);}

你的意思是在构建脚本中还是在ant代码中?我需要在执行某项任务之前执行此操作。