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代码中?我需要在执行某项任务之前执行此操作。