0

我正在编写 ant 脚本并使用 Ant flaka jar 来做一些工作。

但是 flaka 不能像其他外部 Ant 库一样工作。

例如,如果我需要包含 ant-contrib:

  <taskdef resource="net/sf/antcontrib/antlib.xml">
  <classpath>
        <pathelement location="../../lib/ant-contrib.jar"/>
  </classpath>
  </taskdef>

最重要的是,我可以指定 jar 的位置。

但是对于flaka,我看不到这样的事情。在官方网站上,他们只是告诉用户将flaka jar 下载到Ant 安装文件夹中。

当我想使用 flaka jar 时,如何指定它在哪里?

4

2 回答 2

0

我刚刚在 1 分钟内安装了 flaka。只需按照安装说明中的说明将 .jar 放入您的 ..ant/lib 目录即可。

运行这个:

<project xmlns:c="antlib:it.haefelinger.flaka">
 <c:logo>
  Hello, #{property['ant.file'].tofile.name}
 </c:logo>
</project>

正如他们在网站上所说的那样。如果输出与此不同:

Buildfile: C:\Users\Stefanos\Documents\Visual Studio 2010\Projects\stackOverflow\stackOverflow\build.xml
[c:logo] ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
[c:logo] :                               Hello, build.xml                               :
[c:logo] ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

检查你的java版本。它必须 >= 1.5。您的 ant 应该 >= 1.7,最后但并非最不重要的是检查您的权限。

于 2011-10-06T19:54:14.107 回答
0

首先是一些一般性的建议。任何外部库都必须在 ant 的视线范围内,意味着在路径上。
最原始的方法是将您的 ant 插件放在 $ANT_HOME/lib 中,但这会“污染”您的 ant 安装。
将您的外部库放在它自己的位置,fe /ant_xtralibs 并通过 Ant_ARGS 使用 -lib 参数。
Flaka手册第 2 节对此有一些说明,更多详细信息请参见Ant 手册

您处理 antcontrib 的示例通过 taskdef 资源使用传统方法。
现代推荐的方法是使用 XML 命名空间声明,正如 Flaka 手册
在第 2 节之前提到的那样:
“因此,显示的所有构建文件片段都假定构建文件包含以下 XML 命名空间声明”

也可以通过 taskdef 以传统方式使用 Flaka:

<project>
  <taskdef resource="it/haefelinger/flaka/antlib.xml">
   <classpath>
    <pathelement location="/home/rosebud/flaka/ant-flaka-1.02.02.jar"/>
   </classpath>
  </taskdef>

  <!-- when on path via -lib or ANT_ARGS it's enough to use : -->
  <taskdef resource="it/haefelinger/flaka/antlib.xml"/>

  <logo>
   Hello, #{property['ant.file'].tofile.name}
  </logo>

</project>

输出

Trying to override old definition of datatype filterset
Trying to override old definition of task fail
Trying to override old definition of task echo
[logo] ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
[logo] :                               Hello, demo.xml                                :
[logo] ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

请注意以“尝试覆盖..”开头的行,这是因为 Flaka 扩展了一些 ant 任务

但是如果你把 Flaka 放在它自己的命名空间中:

<project name="demo" xmlns:fl="antlib:it.haefelinger.flaka">
 <fl:logo>
  Hello, #{property['ant.file'].tofile.name}
 </fl:logo>
</project>

输出

[fl:logo] ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
[fl:logo] :                               Hello, demo.xml                                :
[fl:logo] ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

不再“试图覆盖...”意味着不再与 ant 自己的任务发生冲突,因为 Flaka 驻留在它自己的命名空间中

简而言之:
1)使用 ANT_ARGS 将您的额外库(Flaka .. 等)带入游戏
2)使用现代的命名空间声明方式

在评论要求命名空间与类路径结合后编辑编辑

是的,关于 antlib 的详细信息,请参阅 Ant 手册,尤其是
“从构建文件内部加载 antlib”部分,对于 Flaka,您将使用类似的内容:

<project xmlns:fl="antlib:it.haefelinger.flaka">
 <taskdef uri="antlib:it.haefelinger.flaka"
  resource="it/haefelinger/flaka/antlib.xml"
  classpath="path/to/flaka.jar"/>

但我相信你仍然没有得到使用 $ANT_ARGS 的优势,
只需使用一些脚本来启动你的 ant 脚本,fe:

对于 Windows
设置 JAVA_HOME=C:\java\jdk\1.6.0_26
设置 ANT_HOME=C:\ant
设置 ANT_ARGS=-lib C:\ant_xtralibs;C:\ant_testlibs
设置 PATH=%PATH%;%JAVA_HOME%\bin;% ANT_HOME%\bin;C:\cvsnt

:: 默认
调用 ant -f %1

:: 调试
::call ant -debug -f %1
... 等等。

对于 Linux/Unix - 不要忘记 ANT_ARGS 行上的引号!
...
ANT_ARGS="-lib /usr/local/ant_xtralibs:/usr/local/ant_testlibs"
导出 ANT_ARGS
...

您不再需要将 taskdef 与类路径一起使用!
使用 -lib 选项加载其他库还有另一个好处。 在 Ant(fe BSF、js、xml)开始解析构建文件
之前,必须加载一些库。

ANT_ARGS 是一个特殊的环境变量。它的内容会自动添加到 Ant 的调用中。

-- 其他可能性 --

1)
将那些'set ANT_ARGS ...'的东西放入=

Linux/Unix
$ANT_HOME/bin/ant

Windows
%ANT_HOME%/bin/ant.bat

缺点=更改了ant核心安装,在将ant安装复制到另一台机器之前记住
您的更改
,奇怪的事情发生了!

2)
把你的额外库放在 ${user.home}/.ant/lib
优势=每个用户都可以使用他自己的一组库

有关详细信息,请参阅 Ant 手册:http: //ant.apache.org/manual/running.html#commandline
http://ant.apache.org/manual/running.html#libs

于 2011-10-06T20:12:10.183 回答