Ant/Build 一个 JAR:构建失败,未找到引用 task.path
Ant/Build a JAR : Build failed, Reference task.path not found
我正在使用 build.xml 开发一个项目来生成 JAR 文件。
当我尝试构建它时出现此错误:
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" />
它可以是什么?感谢您的帮助。
BUILD FAILED D:\xxxxxtrunk\project-java\build.xml:25: Reference task.path not found.
嗯,在你的 build.xml
文件中定义的 class 路径 task.path
在哪里?
当您通过 <taskdef>
定义任务时,您需要做几件事:
- 您需要指定任务所在的jar文件。
- 您需要指定包含任务的 class,以及如何在 jar 中找到它。这可以通过以下两种方式之一完成:
- 你说class在
com.foo.bar.mytask
,然后给它起个名字。
- 您可以在 jar 中指定一个资源(属性文件或 XML 文件),这几乎说明了 class 与每个名称相关联的内容(即
resource="org/tigris/subversion/svnant/svnantlib.xml"
正在做。
- 最后,您需要指定如何找到该 jar 文件。
你错过的最后一个。您指定了对名为 task.path
的 classpath 的引用,但实际上并未定义 classpath.
您可以做几件事:
你可以把jar放到$ANT_HOME/lib
目录下。当您通过 <taskdef/>
定义任务时,Ant 会自动查找那里。我不喜欢这个,因为这意味着你的构建不能在其他用户的机器上运行,因为他们可能没有安装那个 jar。
您可以定义一个class路径来找到它。
这是我的偏好,这是我通常的做法。
<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
目录中,并将每个放在该目录中各自的目录中。
还记得我说过您需要做的一件事是指定包含任务的 class 吗?。
这是您指定的 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>
它只是任务名称到 jar 中 classes 的映射。
- 搜索你的整个build.xml,传递闭包
包含的文件,以及字符串 "task.path".
的所有超级项目
如果缺少或不符合以下表格,请添加或更正表格。请确保您没有尝试以 @id
属性设置以外的其他方式来识别它。
<path id="task.path">
...
</path>
如果在超级项目中找到(通过ant
或antcall
任务调用当前项目),将inheritrefs
属性设置为true
传递定义。
- 如果找到但在
parallel
任务中也定义了相同的 @id
值,最后完成的任务将覆盖其他的参考。考虑清理一下以避免歧义。
另请参阅:Ant objects and references: what is the scope of a reference's ID?
我正在使用 build.xml 开发一个项目来生成 JAR 文件。 当我尝试构建它时出现此错误:
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" />
它可以是什么?感谢您的帮助。
BUILD FAILED D:\xxxxxtrunk\project-java\build.xml:25: Reference task.path not found.
嗯,在你的 build.xml
文件中定义的 class 路径 task.path
在哪里?
当您通过 <taskdef>
定义任务时,您需要做几件事:
- 您需要指定任务所在的jar文件。
- 您需要指定包含任务的 class,以及如何在 jar 中找到它。这可以通过以下两种方式之一完成:
- 你说class在
com.foo.bar.mytask
,然后给它起个名字。 - 您可以在 jar 中指定一个资源(属性文件或 XML 文件),这几乎说明了 class 与每个名称相关联的内容(即
resource="org/tigris/subversion/svnant/svnantlib.xml"
正在做。
- 你说class在
- 最后,您需要指定如何找到该 jar 文件。
你错过的最后一个。您指定了对名为 task.path
的 classpath 的引用,但实际上并未定义 classpath.
您可以做几件事:
你可以把jar放到
$ANT_HOME/lib
目录下。当您通过<taskdef/>
定义任务时,Ant 会自动查找那里。我不喜欢这个,因为这意味着你的构建不能在其他用户的机器上运行,因为他们可能没有安装那个 jar。您可以定义一个class路径来找到它。
这是我的偏好,这是我通常的做法。
<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
目录中,并将每个放在该目录中各自的目录中。
还记得我说过您需要做的一件事是指定包含任务的 class 吗?。
这是您指定的 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>
它只是任务名称到 jar 中 classes 的映射。
- 搜索你的整个build.xml,传递闭包 包含的文件,以及字符串 "task.path". 的所有超级项目
如果缺少或不符合以下表格,请添加或更正表格。请确保您没有尝试以
@id
属性设置以外的其他方式来识别它。<path id="task.path"> ... </path>
如果在超级项目中找到(通过
ant
或antcall
任务调用当前项目),将inheritrefs
属性设置为true
传递定义。- 如果找到但在
parallel
任务中也定义了相同的@id
值,最后完成的任务将覆盖其他的参考。考虑清理一下以避免歧义。
另请参阅:Ant objects and references: what is the scope of a reference's ID?