【问题标题】:Ant/Build a JAR : Build failed, Reference task.path not foundAnt/构建 JAR:构建失败,未找到参考 task.path
【发布时间】:2015-03-06 16:02:31
【问题描述】:

我正在使用 build.xml 生成 JAR 文件的项目。 当我尝试构建它时,我收到了这个错误:

构建文件:D:\xxxxx\trunk\project-java\build.xml

构建失败 D:\xxxxxtrunk\project-java\build.xml:25: 参考 未找到 task.path。

总时间:140 毫秒

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

会是什么?感谢您的帮助。

【问题讨论】:

    标签: java xml ant jar build


    【解决方案1】:

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

    那么,build.xml 文件中定义的类路径 task.path 在哪里?

    当你通过&lt;taskdef&gt;定义一个任务时,你需要做几件事:

    • 需要指定任务所在的jar文件。
    • 您需要指定包含任务的类,以及如何在 jar 中找到它。这可以通过以下两种方式之一完成:
      • 你说类在com.foo.bar.mytask,然后给它一个名字。
      • 您可以在 jar 中指定一个资源(属性文件或 XML 文件),该资源几乎说明了与每个名称关联的类(resource="org/tigris/subversion/svnant/svnantlib.xml" 正在做的事情。
    • 最后,您需要指定如何找到该 jar 文件。

    你错过的最后一个。您指定了对名为 task.path类路径 的引用,但实际上并未定义该类路径。

    你可以做几件事:

    • 你可以把jar放到$ANT_HOME/lib目录下。当您通过&lt;taskdef/&gt; 定义任务时,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 目录中,并将每个 jar 放在该目录中它们自己的目录中。

    还记得我说过你需要的一件事是指定包含任务的类吗? 这是您指定的 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 内的类的映射。

    【讨论】:

    • 知道了,&lt;path id="task.path"&gt; 稍后在 build.xml 中声明。现在可以了。谢谢!
    【解决方案2】:
    1. 搜索整个 build.xml,传递闭包 包含文件,以及字符串“task.path”的所有超级项目。
    2. 如果缺少或没有以下表格,请添加或更正表格。确保您没有尝试以 @id 属性设置以外的其他方式来识别它。

      <path id="task.path">
         ...
      </path>
      
    3. 如果找到但在超级项目中(通过antantcall 任务调用当前项目),请将inheritrefs 属性设置为true 以传递定义。

    4. 如果在parallel 任务中找到,该任务也定义了相同的@id 值,最后完成的任务将覆盖其他的引用。考虑清理内容以避免歧义。

    另请参阅:Ant objects and references: what is the scope of a reference's ID?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2019-03-27
      • 1970-01-01
      相关资源
      最近更新 更多