如何从_within_ build.xml模拟“-lib foo.jar”

时间:2010-03-03 09:11:09

标签: java eclipse ant

通过向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兼容的方式。更好的建议是欢迎:))


编辑:似乎即将发布的ant4eclipse版本1.0包括ecj。这不能回答问题,但可以解决我的基本问题。

2 个答案:

答案 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>