2

<path id="...">build.xml. 在调用编译器之前,我想验证类路径上的每个 jar/目录是否存在,并打印缺少的警告。有人知道现有的解决方案还是我需要为此编写自己的任务?


好的,我决定去做一个自定义任务。在这里,以防有人需要这样的东西:

import java.io.File;
import java.util.Iterator;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.Resources;

public class CheckClasspathTask extends Task {

    private Reference reference;

    public CheckClasspathTask() {
    }

    public void setRefId(Reference reference) {
        this.reference = reference;
    }

    public void execute() throws BuildException {
        Resources resources = new Resources();
        resources.setProject(getProject());
        resources.add((ResourceCollection) reference.getReferencedObject());
        boolean isFirst = true;
        for (Iterator i = resources.iterator(); i.hasNext(); ) {
            String f = i.next().toString();
            if (!new File(f).exists()) {
                if (isFirst) {
                    isFirst = false;
                    System.out.println("WARNING: The following entries on your classpath do not exist:");
                }
                System.out.println(f);
            }
        }
    }
}
4

3 回答 3

2

这将检查类路径中的每个文件或文件夹是否存在。如果其中一个不存在,则构建将失败,并显示第一个无法找到的名称。

<target name="check-classpath" depends="create-classpath">
    <pathconvert pathsep="," property="myclasspath" refid="compile.classpath"/>
    <foreach list="${myclasspath}" param="file" target="check-file-or-folder-exists" />
</target>

<target name="check-file-or-folder-exists">
    <fail message="Error: ${file} not found">
      <condition>
        <not>
          <available file="${file}" />
        </not>
      </condition>
    </fail>
</target>

请注意,<foreach>在 ant-contribs -- Ant Contribs clickable LINK

这将需要加载 ant-contrib jar 并连接其中的所有目标:

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="${some.lib.dir}/ant-contrib-1.0b3.jar" />
    </classpath>
</taskdef>

应该存在一个<for>任务,允许设置一个选项以继续遍历所有路径元素,并且只在最后显示一个错误。我发现我的 Eclipse 版本<foreach>已经在类路径中,所以我认为这对我来说已经足够了。

于 2013-07-26T20:09:12.433 回答
1

我会说可能有一个自定义的 ant 任务是有序的,有点像在这个build.xmlorg.netbeans.modules.bpel.project.anttasks.ValidateBPELProjectTask的 ' pre-dist' 目标中完成的。

注意:ValidateBPELProjectTask ant 任务比您通常的自定义任务要复杂一些:它需要有自己的类路径才能运行(类路径最初并未最初传递给 build.xml)。
由于您无法修改当前 ant 任务类加载器的类路径,因此 ValidateBPELProjectTask 定义了一个新的AntClassLoader并调用setContextClassLoader().

不过,您将不需要这样的机制:您只需将要检查的目录列表作为参数传递给您的任务。

于 2009-04-15T16:47:48.717 回答
1

我还没有找到很多方法来使用默认任务迭代 Ant 脚本中的路径。如果您在具有类 UNIX 外壳的机器上构建,您可以调用外壳来检查类路径元素。

调用 shell 脚本时,您可以使用applytask,但是当类路径元素不存在时,我无法打印它。

假设您有以下类路径声明:

<path id="your.classpath">
    <fileset dir="your.libs"/>
    <pathelement location="/some/missing/dir"/>
</path>

这将报告是否缺少任何元素,但不会告诉您哪些元素:

<apply executable="test" type="file" ignoremissing="false">
    <arg value="-e"/>
    <srcfile/>
    <path refid="build.classpath"/>
</apply>

您可以将其与一个简单的 shell 脚本结合起来,并通过更改executable属性来获得所需的内容——假设您只想要一个大的警告消息而不是构建失败:

#!/bin/sh

test -e "$1" || echo "WARNING: Classpath element $1 does not exist!"

如果您希望构建失败,您可以将apply任务设置为在报告错误时失败(在这种情况下是缺少文件/目录),然后修改 shell 脚本以在打印警告后返回非零退出代码。

另一种方法是使用exec任务并内联执行一个小脚本:

<pathconvert property="classpath" refid="build.classpath" pathsep=":"/>
<exec executable="sh">
    <arg value="-c"/>
    <arg value="for f in `echo ${classpath} | tr ':' '\n'`; do test -e $f || echo WARNING: Classpath element $f     does not exist!; done"/>
</exec>
于 2009-04-15T18:07:09.273 回答