代码之家  ›  专栏  ›  技术社区  ›  Ryan Ahearn

Ant找不到外部定义的taskdef所需的类

  •  14
  • Ryan Ahearn  · 技术社区  · 16 年前

    我尝试使用AxIS-Java2WSDL Ant任务从Java类中创建一个WSDL,但不能获得类路径正确。

    我正在使用Ubuntu的LyBaxIs Java包,它安装AxIS-ANT.JAR在$ANTYHOME/LIB和AXIS.JA//URS/Stase/Java中。build.xml的有趣部分如下:

    <property name="library.dir" value="lib"/>
    <property name="system.library.dir" value="/usr/share/java"/>
    <path id="libraries">
        <fileset dir="${library.dir}">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="${system.library.dir}">
            <include name="*.jar"/>
        </fileset>
    </path>
    
    <target name="genwsdl" depends="compile">
        <taskdef resource="axis-tasks.properties" classpathref="libraries"/>
        <axis-java2wsdl>
                details omitted
        </axis-java2wsdl>
    </target>
    

    运行 ant genwsdl 结果:

    /build.xml:50: taskdef A class needed by class
    org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask
    cannot be found: org/apache/axis/utils/DefaultAuthenticator
    

    Ant能够找到axis-java2wsdl任务的定义,因为axis-ant.jar在$ant_home/lib中,但在axis.jar中找不到类,即使该jar位于“libraries”定义的路径上。

    我知道这是一个类路径问题,因为通过将axis.jar符号链接到$ant home/lib中,我能够越过defaultauthenticator找到其他类。如何让taskdef在/usr/share/lib或项目的本地lib目录中识别jar文件,而不将所有内容符号化链接到$ant home/lib?

    编辑:

    我终于能够用这一行成功地生成WSDL:

    ant -lib /usr/share/java/axis.jar -lib /usr/share/java/jaxrpc.jar -lib /usr/share/java/wsdl4j.jar -lib /usr/share/java/commons-logging.jar -lib /usr/share/java/commons-discovery.jar -lib build genwsdl
    

    如果有人能告诉我在build.xml中无法定义那些库时我做错了什么,我还是会非常感激的。

    6 回复  |  直到 12 年前
        1
  •  15
  •   VonC    16 年前

    一般来说,这是可行的。但是你需要非常仔细地检查哪些类在哪里。

    如果您的任务类可以加载到类加载器层次结构(如classpath或ant_home/lib)中更高级别的类加载器中,那么您的ClassPathRef将被忽略。 .

    阅读 FAQ entry 了解更多详细信息。

    Ant的类加载器实现使用 Java's delegation model

    类加载器类使用委托模型来搜索类和资源。类加载器的每个实例都有一个关联的父类加载器。当被调用查找类或资源时,类加载器实例将把对类或资源的搜索委托给其父类加载器,然后再尝试查找类或资源本身。虚拟机的内置类加载器(称为引导类加载器)本身没有父级,但可以充当类加载器实例的父级。

    注:运行 ant -diagnostics can help too .

        2
  •  5
  •   OscarRyz    16 年前

    蚂蚁 mechanism 添加库的方法是:

    • 通过命令行参数-lib
    • 添加到$user.home/.ant/lib
    • 添加到$ant.home/lib

    只有。这个 manual 没有提到使用 system.library.dir目录 财产。可能出于这个目的它被忽略了。

    另外,在详细模式下运行ant(和-verbose)来查看引擎盖下正在做什么。

        3
  •  1
  •   matt b    16 年前

    为什么不选择最简单的选项并在 <taskdef> ?

    <taskdef resource="axis-tasks.properties">
        <classpath>
            <fileset file="/path/to/axis/jars"/>
        </classpath>
    </taskdef>
    

    或者创造一秒钟 <classpath> 子集合的条目 library.dir ?

    <path id="axis-tools-classpath">
        <fileset dir="/path/to/axis/home">
            <include name="*.jar"/>
        </fileset>
        <path refid="library.dir"/>
    </path>
    

    乱搞 ${ant.home}/lib 这不是一个好主意,几乎总是可以避免的。

        4
  •  1
  •   Ralf    15 年前

    我可以在taskdef任务中直接指定类路径,由 马特B . 对于我的项目,我发现在项目文件夹中包含taskdef库并在ant build文件中指定类路径非常有用,只需在其他开发PC上进行设置。我使用以下taskdef:

    <taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>
    

    请注意,这可能不适用于早于1.7.0的Ant版本。

        5
  •  1
  •   Kieveli    14 年前

    利用这里的答案和所有的部分信息,我想出了一个解决方案。我将jar(Ant文件)添加到项目中的lib文件夹(特别是mysql jdbc驱动程序)中。然后我在Ant中运行了一个安装任务,该任务将复制到用户的home.ant/lib文件夹中,然后Ant失败,并显示一条要重新启动的消息。对于一个用户来说,它只失败一次,然后每次都能工作。如果将jar更新到新版本,可能会很棘手…

    下面是ant build.xml:

    <project name="data_source" default="build">
    
      <!-- BUILD PROPERTIES -->
      <property file="build.properties"/>
    
      <!-- SQL Server Properties -->
      <property name="sql.driver" value="org.gjt.mm.mysql.Driver"/>
      <property name="sql.url" value="jdbc:mysql://127.0.0.1/datastore"/>
      <property name="sql.user" value="user"/>
      <property name="sql.pass" value="password"/>
    
      <!-- FILE LOCATIONS  -->
      <property name="sql.dir" location="sql"/>
    
      <!-- INITIALIZE PROJECT -->
      <target name="init" description="Initialize the project">
          <available property="no.ant.lib.dir" file="${user.home}/.ant/lib/" type="dir" />
      </target>
    
      <!-- SETUP MYSQL -->
      <target name="setup_mysql" description="Copy the lib so ant can see it" unless="no.ant.lib.dir">
          <mkdir dir="${user.home}/.ant"/>
          <mkdir dir="${user.home}/.ant/lib"/>
          <copy file="lib/mysql-connector-java-5.1.13-bin.jar" todir="${user.home}/.ant/lib"/>
    
          <!-- ant already missed picking up the jar - we have to restart -->
          <fail message="JDBC mysql class copied to ${user.dir}/.ant/lib/ - please restart ant" />
      </target>
    
      <!-- BUILD DATA SOURCES -->
      <target name="build" depends="init,setup_mysql,clean_data" description="Create and populate tables">
    
        <sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" >
          <transaction src="${sql.dir}/create_tables.sql"/>
          <transaction src="${sql.dir}/insert_data.sql"/>
        </sql>
      </target>
    
       <!-- CLEAN PROJECT -->
      <target name="clean" description="Cleans up project build">
        <!-- Don't clean data sources here - may get called by accident -->
      </target>
    
      <!-- Delete all tables and data -->
      <target name="clean_data" description="Deletes all data and tables">
        <echo>Dropping all database tables in ${sql.schema}...</echo>
        <property name="exec.command" value="mysqldump -u${sql.user} -p${sql.pass} --add-drop-table --no-data ${sql.schema} | grep ^DROP | mysql -u${sql.user} -p${sql.pass} ${sql.schema}" />
        <exec executable="sh">
          <arg value = "-c"/>
          <arg value="${exec.command}"/>
        </exec>
    
      </target>
    
    </project>
    

    希望这有帮助

        6
  •  0
  •   Andrew    12 年前

    当我将一个*.jar复制到ant.home/lib s时,我遇到了同样的问题,然后我使用-lib来定位*.jar,它运行正常!我想是新的罐子装不上了,那我来测试一下!

    推荐文章