我正在处理一个带有构建的项目.xml以生成JAR文件。当我尝试构建它时,出现此错误:
构建文件: D:\xxxxx\trunk\project-java\build.xml
构建失败 D:\xxxxxtrunk\project-java\build.xml:25:参考 找不到任务路径。
总时间:140
毫秒
构建.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" />
能是什么?感谢您的帮助。
构建失败 D:\xxxxxtrunk\project-java\build.xml:25:找不到引用任务路径。
那么,类路径task.path
在您的build.xml
文件中定义在哪里?
当您通过 <taskdef>
定义任务时,您需要做几件事:
- 您需要指定任务所在的 jar 文件。
- 您需要指定包含任务的类,以及如何在 jar 中找到它。这可以通过以下两种方式之一完成:
- 你说这个类在
com.foo.bar.mytask
,然后给它起个名字。 - 您可以在jar中指定一个资源(属性文件或XML文件),该资源几乎说明了与每个名称关联的类(这就是
resource="org/tigris/subversion/svnant/svnantlib.xml"
正在做的事情。
- 你说这个类在
- 最后,您需要指定如何查找该 jar 文件。
你错过的最后一个。您指定了对名为 task.path
的类路径的引用,但实际上并未定义该类路径。
您可以执行以下几项操作:
-
您可以将 jar 放入
$ANT_HOME/lib
目录中。当您通过<taskdef/>
定义任务时,Ant 会自动查找该任务。我不喜欢这个,因为这意味着你构建的不能在其他用户的机器上运行,因为他们可能没有安装那个jar。 -
您可以定义类路径来查找它。
的偏好,这是我通常的做法。
<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml">
<classpath>
<fileset dir="${basedir}/antlib/svnant}"/>
</classpath>
</taskpath>
在您的项目中,创建一个名为 ${basedir}/antlib/svnant
的目录,并将此 SVNAnt 任务附带的所有五个 jar 放在该目录中。这样,可选生成任务所需的所有 jar 现在都在项目中。如果有人从版本控制系统中签出您的项目,他们会自动获得所需的任务 jar。
我把我所有的可选 ant 任务 jar 放在那个 ${basedir}/antlib
目录中,并将每个 ant 任务 jar 放在该目录中自己的目录中。
还记得我说过你需要做的一件事是指定包含任务的类吗?以下是您在svnant.jar
中指定的org/tigris/subversion/svnant/svnantlib.xml
文件的外观:
<?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>
它只是 jar 内类的任务名称映射。
- 搜索整个构建.xml,传递闭包包含的文件,以及字符串"task.path"的所有超级项目。
-
如果缺少或没有以下表单,请添加或更正表单。 确保您没有尝试以
@id
属性设置以外的某种方式识别它。<path id="task.path"> ... </path>
-
如果在超级项目(通过
ant
或antcall
任务调用当前项目)中找到,请将inheritrefs
属性设置为true
以传递定义。 - 如果找到,但在也定义相同
@id
的parallel
任务中值,则最后一个要完成的任务将覆盖另一个任务的引用。 考虑清理内容以避免歧义。
另请参阅:Ant 对象和引用:引用 ID 的范围是什么?