2009-04-15 6 views
2

У меня есть <path id="..."> в моем build.xml. Перед вызовом компилятора я хочу проверить, что каждый каталог jar/pathpath существует и печатать предупреждение с отсутствующими. Кто-нибудь знает существующее решение или мне нужно написать свою собственную задачу для этого?Проверка пути в муравейнике


ОК, я решил пойти на заказ. Здесь, в случае, если кто-нибудь когда-либо нуждается в такую ​​вещь:

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); 
      } 
     } 
    } 
} 

ответ

1

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

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

Вам не нужен такой механизм: вы можете просто передать список каталогов, чтобы проверить свою задачу как параметр.

+0

Я, кажется, помню, что прохождение объекта пути к пользовательской задаче легко. Я предполагаю, что это то, что вы имели в виду под «передачей списка каталогов»? – araqnid

+0

@araqnid да, вот что я имел в виду – VonC

1

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

При вызове shell-скриптов вы можете использовать apply task, но я не смог его распечатать, когда элемент 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 task и просто выполнить небольшой встроенный скрипт:

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

К сожалению, я не могу полагаться на Unix-подобную оболочку на каждом ящике разработчика, поэтому я должен придерживаться Java. Однако ваш однострочный вкладыш очень аккуратный --- стоит стать функцией в моем ~/.bashrc +1 – ngn

2

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

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

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

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

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