2015-01-08 3 views
1

Я работаю над проектом с build.xml для создания JAR-файла. Когда я пытаюсь построить его, я получаю эту ошибку:Ant/Build JAR: Ошибка сборки, ссылка task.path не найден

Buildfile: D:\xxxxx\trunk\project-java\build.xml

BUILD FAILED D:\xxxxxtrunk\project-java\build.xml:25: Reference task.path not found.

Total time: 140 milliseconds

build.xml с линией, где он выходит из строя.

<?xml version="1.0"?> 
<project name="xxxxx" default="prepare-release" basedir="."> 

<property name="project.dir" value="."/> 
<property file="${project.dir}/build.properties"/> 
<property file="${project.dir}/svn.properties"/> 

<property name="dist.dir" value="${project.dir}/dist"/> 

<property name="build.dir" value="${project.dir}/build"/> 
<property name="src.dir" value="${dist.dir}/${dist.type}/src"/> 
<property name="release.dir" value="${project.dir}/release"/> 



<!-- load svn tasks --> 
// Pb on this line 
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" 
    classpathref="task.path" /> 

Что это может быть? Спасибо за вашу помощь.

ответ

1

BUILD FAILED D:\xxxxxtrunk\project-java\build.xml:25: Reference task.path not found.

Ну, где же путь к классам task.path определены в файле build.xml?

При определении задачи с помощью <taskdef>, вам нужно сделать несколько вещей:

  • Вам необходимо указать файл фляги, где задача существует.
  • Вам нужно указать класс, содержащий задание, и как его найти в банке. Это можно сделать одним из двух способов:
    • Вы говорите, что класс находится в com.foo.bar.mytask, а затем дайте ему имя.
    • Вы можете указать ресурс в банке (либо файл свойств или файл XML), который в значительной степени говорит, что класс связан с каждым именем (что resource="org/tigris/subversion/svnant/svnantlib.xml" делает.
  • Наконец, вам нужно чтобы определить, как найти этот файл JAR.

Это последний один вы пропали без вести. указана ссылка на называются классам task.path, но на самом деле не определить, что путь к классам.

Есть несколько вещей, которые вы можете сделать:

  • Вы можете поместить банку в каталог $ANT_HOME/lib. Когда вы определяете задачу через <taskdef/>, Ant автоматически смотрит туда. Я не люблю этого, потому что это означает, что вы создаете, не работает на компьютерах других пользователей, потому что у них может не быть установленной этой банки.

  • Вы можете определить путь к class, чтобы найти его.

Это мое предпочтение, и вот как я обычно это делаю.

<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml"> 
    <classpath> 
     <fileset dir="${basedir}/antlib/svnant}"/> 
    </classpath> 
</taskpath> 

В вашем проекте, создать каталог с именем ${basedir}/antlib/svnant и поставить все пять банок, которые пришли с этой SVNAnt задачей в этой директории. Таким образом, все банки, необходимые для ваших дополнительных задач сборки, теперь находятся внутри вашего проекта. Если кто-то проверяет ваш проект из системы управления версиями, они автоматически получают необходимые банки задач.

Я поместил все мои дополнительные муравьиные задачи в каталог ${basedir}/antlib и поместил их в свой каталог в этом каталоге.

Помните, что я сказал, что одна из вещей, которые вам нужны, - это указать класс, содержащий задание ?. Вот что это org/tigris/subversion/svnant/svnantlib.xml файл, указанный выглядит в svnant.jar:

<?xml version="1.0"?> 
<antlib> 
    <!-- Tasks --> 
    <taskdef name="svn" 
    classname="org.tigris.subversion.svnant.SvnTask" /> 

    <!-- Types --> 
    <typedef name="svnFileSet" 
    classname="org.tigris.subversion.svnant.types.SvnFileSet" /> 

    <!-- Selectors --> 
    <typedef name="svnNormal" 
    classname="org.tigris.subversion.svnant.selectors.Normal" /> 
    <typedef name="svnAdded" 
    classname="org.tigris.subversion.svnant.selectors.Added" /> 
    <typedef name="svnReplaced" 
    classname="org.tigris.subversion.svnant.selectors.Replaced" /> 
    <typedef name="svnModified" 
    classname="org.tigris.subversion.svnant.selectors.Modified" /> 
    <typedef name="svnConflicted" 
    classname="org.tigris.subversion.svnant.selectors.Conflicted" /> 
    <typedef name="svnIgnored" 
    classname="org.tigris.subversion.svnant.selectors.Ignored" /> 
    <typedef name="svnUnversioned" 
    classname="org.tigris.subversion.svnant.selectors.Unversioned" /> 
    <typedef name="svnLocked" 
    classname="org.tigris.subversion.svnant.selectors.Locked" /> 
    <typedef name="svnMissing" 
    classname="org.tigris.subversion.svnant.selectors.Missing" /> 
    <typedef name="svnDeleted" 
    classname="org.tigris.subversion.svnant.selectors.Deleted" /> 

    <!-- Conditions --> 
    <typedef name="svnExists" 
    classname="org.tigris.subversion.svnant.conditions.Exists" /> 

</antlib> 

Это просто карта названия задач для классов внутри кувшина.

+0

Понял, '<путь ID = "task.path">' был объявлен позже в build.xml. Сейчас все в порядке. Благодаря! – Someday

1
  1. Искать весь файл build.xml, транзитивное закрытие включенных файлов и всех суперпроектов для строки «task.path».
  2. При отсутствии или отсутствии следующей формы, добавьте или исправьте форму. Убедитесь, что вы не пытаетесь идентифицировать его каким-либо образом, кроме настройки атрибута @id.

    <path id="task.path"> 
        ... 
    </path> 
    
  3. Если найден, но в супер-проекте (который вызывает текущий проект с помощью ant или antcall задач), установите атрибут inheritrefs в true пройти по определению.

  4. Если найдено, но в задаче parallel, которая также определяет то же значение @id , последняя задача, которую нужно завершить, переопределит ссылку другого. Подумайте об очистке, чтобы избежать двусмысленности.

Смотрите также: Ant objects and references: what is the scope of a reference's ID?

Смежные вопросы