【问题标题】:Access Antlib Resources From Within Apache Ant Macros从 Apache Ant 宏中访问 Antlib 资源
【发布时间】:2011-03-02 06:43:36
【问题描述】:

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

例如,在我的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 写出到一个临时文件中,但IMO 那是一个hack。

【问题讨论】:

    标签: ant jar


    【解决方案1】:

    不要使用style 属性,而是尝试嵌套&lt;style&gt; 元素,这将允许您指定javaresource 作为样式表。然后,您可以将样式表放在 jar 中您的 antlib.xml 旁边,它将在类路径中可用。

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

    【讨论】:

    • 谢谢。我试图让它工作,但到目前为止,除非我明确指定类路径,否则它找不到 xslt。我会告诉你我怎么走的。
    • @Tom 哦,加载类的乐趣!看起来javaresource 在 antlib 中默认使用核心 ant 类加载器,而不是 antlib 本身的类加载器,我认为这是正确的。甚至可能值得将其作为错误报告。
    • @Tom 一些潜在的解决方法:将 jar 放在一个 ant lib 目录中或使用 ant 的 -lib 选项并依靠 ant 自动从 antlib uri 命名空间声明中找到 antlib (这就是我正在做的事情,这就是为什么它似乎对我有用)。然后一切都使用核心类加载器。或者在taskdefjavaresource 中使用loaderRef 属性。您必须确保在两者中使用相同的字符串,但不必在 antlib 中的 javaresource 中指定类路径。
    • 或许还可以将parentFirst 属性设置为javaresource(由Ant 1.8.0 引入)设置为false 在这里值得一试吗?
    【解决方案2】:

    我首先要看的是从类加载器加载 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。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多