Проверка пути к классу в муравье - PullRequest
2 голосов
/ 15 апреля 2009

У меня есть <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);
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 27 июля 2013

Это проверит, что каждый файл или папка в пути к классам существует. Если один из них этого не сделает, он не сможет выполнить сборку с указанием имени первого, который не может быть найден.

<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 ССЫЛКА

Это понадобится для загрузки банки с муравьиным вкладом и подключения всех целей в ней:

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

Предполагается, что существует задача <for>, которая позволит установить опцию для продолжения через все элементы пути и показать только ошибку в конце. Я обнаружил, что в моей версии Eclipse уже есть <foreach> на пути к классам, поэтому я подумал, что этого достаточно для меня.

1 голос
/ 15 апреля 2009

Я не нашел много способов перебрать путь в скрипте Ant, используя задачи по умолчанию. Если вы работаете на машине с UNIX-подобной оболочкой, вы можете обратиться к ней, чтобы проверить элементы classpath.

При вызове сценариев оболочки вы можете использовать задачу apply , но я не смог распечатать ее, когда элемент classpath не существовал.

Предположим, у вас есть следующее объявление classpath:

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

Вы можете объединить это с простым сценарием оболочки и получить то, что вы хотите, изменив атрибут executable - при условии, что вы просто хотите получить большое предупреждающее сообщение, а не сбой сборки:

#!/bin/sh

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

Если вы хотите, чтобы сборка завершилась неудачей, вы можете настроить задачу apply на сбой, если сообщается об ошибке (в данном случае отсутствует файл / каталог), а затем измените скрипт оболочки, чтобы он возвращал ненулевой код завершения после того, как предупреждение напечатано.

В качестве альтернативы можно использовать задачу 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>
1 голос
/ 15 апреля 2009

Я бы сказал, что, вероятно, заказная задача муравья в порядке, немного похожая на org.netbeans.modules.bpel.project.anttasks.ValidateBPELProjectTask, выполненную в цели 'pre-dist' этой build.xml .

Примечание: задача ValidateBPELProjectTask ant немного сложнее, чем ваша обычная пользовательская задача: для ее запуска должен быть свой собственный путь к классу (сначала путь к классу изначально не передавался в build.xml). 1009 * Поскольку вы не можете изменить путь к классу текущего загрузчика классов для задачи муравья, ValidateBPELProjectTask определяет новый AntClassLoader и вызывает setContextClassLoader().

Однако вам не понадобится такой механизм: вы можете просто передать список каталогов для проверки вашей задаче в качестве параметра.

...