如何为Ant任务的枚举属性提供允许值列表

时间:2015-03-13 19:04:54

标签: java ant enums

我正在通过从Apache Ant扩展Task.java来编写自定义任务。我需要在任务的一个属性中传递一些枚举值。

假设我有一个值为{A,B,C}的枚举Foo,并且我的属性optionType在其setter方法中接受枚举Foo。以下是我的自定义任务的外观 -

   public Enum Foo{ A, B, C}

   public class MyTask extends Task {
       String optionType;

       public setOptionType(Foo f) {
           this.optionType = f.getName();
       }
    }

现在,当我在build.xml中使用带有一些无效选项的optionType属性时,如下所示 -

<myTask optionType="D"/>

Ant正确地给了我错误

  

'D'不是Foo“

的允许值

这很好,但我可以在自定义任务代码中捕获错误并列出Foo的允许值吗?目前看来默认消息缺少更多信息,我想自定义它。

下面是Ant -

中的调用序列的stackTrace
at org.apache.tools.ant.IntrospectionHelper$12.set(IntrospectionHelper.java:1232)
at org.apache.tools.ant.IntrospectionHelper$AttributeSetter.setObject(IntrospectionHelper.java:1502)
at org.apache.tools.ant.IntrospectionHelper.setAttribute(IntrospectionHelper.java:405)
at org.apache.tools.ant.RuntimeConfigurable.maybeConfigure(RuntimeConfigurable.java:388)
at org.apache.tools.ant.RuntimeConfigurable.maybeConfigure(RuntimeConfigurable.java:344)
at org.apache.tools.ant.Task.maybeConfigure(Task.java:202)
at org.apache.tools.ant.UnknownElement.configure(UnknownElement.java:196)
at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)
at org.apache.tools.ant.Task.perform(Task.java:347)
at org.apache.tools.ant.Target.execute(Target.java:390)
at org.apache.tools.ant.Target.performTasks(Target.java:411)

1 个答案:

答案 0 :(得分:0)

  

有没有办法在我的自定义任务代码中捕获错误并列出Foo的允许值?

这似乎不可能,因为异常发生在任务执行尚未开始的阶段。它发生在内省帮助程序代码中,该代码在调用自定义任务之前在任务属性和setter方法之间进行映射。我看到的唯一可能的解决方案是通过更改IntrospectionHelper类来修补Ant(API文档不鼓励更改此类,因此请确保您需要的是值得更改并且您运行一些测试以确保没有休息时间)。异常堆栈跟踪应该有助于找到enum的评估位置,以便您在那里自定义错误消息。

另一个选项是将任务调用放在trycatch块中,该块在Ant-Contrib中提供。在这种情况下,您可以在catch块中显示错误消息。如果您不希望在每次调用自定义任务时放置trycatch,您可以创建一个集中调用的包装器macrodef

<macrodef name="myTaskMacro">
   <attribute name="optionType"/>   
   <sequential>
      <trycatch property="foo" reference="bar">
          <try>
             <myTask optionType="@{optionType}"/>
          </try>

          <catch>
             <echo>Error message...</echo>
          </catch>
       </trycatch>  
   </sequential>
</macrodef>