2011-03-01 57 views
2

是否可以从Antlib中定义的Apache Ant宏中访问资源?从Apache Ant宏中访问Antlib资源

例如,在我的antlib.xml中,我有一个执行一些XSLT的宏。理想情况下,我希望将XSLT文件打包在与antlib.xml相同的JAR中,但我不知道如何指定XSLT的位置。

这里是(简化)代码:

<antlib xmlns:tibant="antlib:org.windyroad.tibant"> 
    <macrodef name="configure-ear"> 
     <attribute name="xml" /> 
     <attribute name="out" /> 
     <sequential> 
      <xslt in="@{xml}" 
        out="@{out}" 
        style="...what to put here..."> 
      </xslt> 
     </sequential> 
    </macrodef> 
</antlib> 

的问题是,无论我放在style属性使用的antlib相对于basedir的项目,我无法找到任何方式指定相对于antlib.xml的路径。

任何想法?

我可以出货的XSLT作为一个单独的文件,但后来我就需要给用户提供一些方法来指定的XSLT,这是不理想的(例如设置tibant.home属性)的位置。我也可以使用echoxml将XSLT写入临时文件,但是这是一种黑客攻击。

回答

2

除了使用style属性,尝试嵌套<style>元素,这将允许你指定一个javaresource的样式表。然后,您可以将样式表放在jar中的antlib.xml旁边,它将在类路径中可用。

<xslt in="@{xml}" 
    out="@{out}"> 
    <style> 
     <javaresource name="your/package/structure/style.xslt" /> 
    </style> 
</xslt> 
+0

谢谢。我试图让它工作,但到目前为止,它找不到xslt,除非我明确指定类路径。我会让你知道我怎么走。 – 2011-03-06 19:56:38

+0

@Tom哦,班加载的乐趣!它看起来像'javaresource'在antlib中默认使用核心ant类加载器,而不是antlib本身的类加载器,这正是我认为是正确的事情。它甚至可能值得作为错误报告。 – matt 2011-03-07 16:20:48

+1

@Tom一些潜在的解决方法:将jar放在ant lib目录之一中,或者对ant使用'-lib'选项并依靠ant自动从antlib uri命名空间声明中找到antlib(这正是我所做的这就是为什么它似乎为我工作)。然后everthing使用核心类加载器。或者在'taskdef'和'javaresource'中使用'loaderRef'属性。您必须确保两者都使用相同的字符串,但您不必在antlib的'javaresource'中指定类路径。 – matt 2011-03-07 16:26:57

1

我想看的第一件事就是从类加载器中加载XSL作为资源。您应该可以使用LoadResource任务完成此任务(http://ant.apache.org/manual/Tasks/loadresource.html)。接下来我会看看XSLT任务为指定样式提供的选项。它看起来没有任何能够采用XSLT的文字内容。您可以通过将XSLT内容写入临时文件,然后将临时文件的路径提供给XSLT任务来解决此问题。

所以......从类加载器

  1. 加载XSLT文本。
  2. 使用Tempfile任务获取临时文件(http://ant.apache.org/manual/Tasks/tempfile.html)。
  3. 使用Echo任务将XSLT文本写入临时文件。
  4. 参照临时文件调用XSLT。