通过向ant指定“-lib foo.jar”,我得到了foo.jar中的类被添加到ant类加载器并且可用于采用类名参数的各种任务的行为。
我希望能够指定相同的行为,但只能从内部 build.xml中指定(因此我们可以在vanilla ant上执行此操作)。
对于taskdef,我们的代码如下:
<taskdef resource="net/sf/antcontrib/antlib.xml" description="for/foreach tasks">
<classpath>
<pathelement location="${active.workspace}/ant-contrib-1.X/lib/ant-contrib.jar" />
</classpath>
</taskdef>
其中定义完全由列出的ant-contrib.jar提供。
“全局”ant类路径的等效机制是什么?
(我已经想到这是让<javac>
使用ecj-3.5.jar在JRE上编译的方法 - Specifying the Eclipse compiler completely from _within_ build.xml - 以与ant 1.7兼容的方式。更好的建议是欢迎:))
答案 0 :(得分:1)
我已经发布了您已关联的问题的答案。我将在这里重复一般解决方案。
阅读Running Ant via Java,我认为您可以编写一个简单的包装器,它将正确设置类路径并将任何第三方库添加到生成的类路径中。
这里我只是将上面链接中的示例剪切并粘贴,并将库添加到类路径中:
<java
classname="org.apache.tools.ant.launch.Launcher"
fork="true"
failonerror="true"
dir="${sub.builddir}"
timeout="4000000"
taskname="startAnt"
>
<classpath>
<pathelement location="${ant.home}/lib/ant-launcher.jar"/>
<pathelement location="/path/to/3rd-party-lib.jar"/>
</classpath>
<arg value="-buildfile"/>
<arg file="${sub.buildfile}"/>
<arg value="-Dthis=this"/>
<arg value="-Dthat=that"/>
<arg value="-Dbasedir=${sub.builddir}"/>
<arg value="-Dthe.other=the.other"/>
<arg value="${sub.target}"/>
</java>
我认为您甚至可以通过引用${ant.file}
重用相同的构建文件,只需将不同的目标作为入口点。
修改强>
我认为,此解决方案应仅用作最后手段度量。如果任务通常支持<classpath>
标记,则在本地将所需的库添加到该特定任务。您通过ant-contrib taskdef
在您的问题中给出了一个完美的例子。
答案 1 :(得分:1)
如果你决定转移到Ant 1.8,你可以使用以下结构:
<import>
<javaresource name="resource_name.xml">
<classpath location="path_to_jar.jar" />
</javaresource>
</import>