Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Ant找不到外部定义的taskdef所需的类_Java_Ant_Classpath_Axis - Fatal编程技术网

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

Java Ant找不到外部定义的taskdef所需的类,java,ant,classpath,axis,Java,Ant,Classpath,Axis,我试图使用axis-Java2WSDLAnt任务从我的一个java类创建wsdl,但我无法获得正确的类路径 我使用的是Ubuntu的libaxisJava包,它在$ant_HOME/lib中安装axis-ant.jar,在/usr/share/java中安装axis.jar。my build.xml的有趣部分如下所示: <property name="library.dir" value="lib"/> <property name="system.library.dir" v

我试图使用axis-Java2WSDLAnt任务从我的一个java类创建wsdl,但我无法获得正确的类路径

我使用的是Ubuntu的libaxisJava包,它在$ant_HOME/lib中安装axis-ant.jar,在/usr/share/java中安装axis.jar。my 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能够找到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中定义这些库,我会非常感激。添加库的Ant是:

  • 通过命令行参数-lib
  • 添加到${user.home}/.ant/lib
  • 添加到${ant.home}/lib
只是。没有提到任何关于使用system.library.dir属性的内容。可能出于这个目的,它几乎被忽略了


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

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

如果您的任务类可以加载到类加载器层次结构中更高的类加载器中(如CLASSPATH或ANT_HOME/lib),那么您的classpathref将被忽略

有关更多详细信息,请阅读

Ant的类加载器实现使用

ClassLoader类使用委托模型来搜索类和资源。类加载器的每个实例都有一个关联的父类加载器。当被调用查找类或资源时,类加载器实例将在尝试查找类或资源本身之前,将对该类或资源的搜索委托给其父类加载器。虚拟机的内置类加载器称为引导类加载器,它本身没有父类,但可以作为类加载器实例的父类


注意:运行
ant-diagnostics

为什么不选择最简单的选项并在
中指定类路径


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

我可以直接在taskdef任务中指定类路径,如matt b所述。对于我的项目,我发现将taskdef库包含在项目文件夹中并在ant构建文件中指定类路径非常有用,以便在其他开发PC上进行简单设置。我使用以下taskdef:

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


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

利用这里的答案和所有部分信息,我想出了一个解决方案。我将ant文件所需的jar添加到项目的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>

正在删除${sql.schema}中的所有数据库表。。。

希望这有帮助

我在将*.jar复制到{ant.home}/libs时遇到了同样的问题,然后我使用-lib来定位*.jar,运行正常!我认为这是新罐不能装,然后我会测试它! system.library.dir是我定义的一个属性,它正被javac任务中的classpathref成功使用。为什么不在taskdef任务中使用它?奇怪的是,您可以添加带有用于编译的库,但不能用于运行外部任务。因为,该“值”用于将要运行的“程序”(javac)。但是,试图将它用于已经运行的程序是行不通的(已经运行的程序是ant)。例如,“javac”任务是在ant运行时定义的。但是javac的参数没有。当您使用该属性时,您将定义javac的参数,然后运行它。另一方面,当ant已经运行时,您的可选任务不存在。即使您试图使用。。。。。属性,则脚本由于没有定义该任务的源而失败。通过使用列出的策略之一,您允许ant定义它应该在哪里查找该任务。这可能是一种解决方法。加载属性并使用“ant任务”启动新的ant任务。请参见:看起来与此问题相同的类装入器问题:taskdef忽略了classpathref,也忽略了其任务中的任何直接类路径。我相信问题正如VonC所说的,axis-ant.jar是在一个找不到axis.jar的类加载器中找到的,所以解决方法是在~/.ant/lib中使用-lib或sumlinks。也许你需要解决库的布局问题——听起来你可以通过确保任何类加载器也找到axis-ant.jar来解决问题有一个axis.jar可用。同意,库的布局并不理想。这是在Ubuntu中安装ant和libaxis java包后的默认布局。但也不理想的做法是在这些包周围移动或在$ANT_HOME/lib中抛出一堆符号链接。我通常对向项目中添加一个shell脚本并使用正确的-lib参数调用ANT的解决方案感到满意
<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>
<taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>
<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>