首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ant找不到外部定义的taskdef所需的类

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

Stack Overflow用户
提问于 2009-01-27 04:20:57
回答 6查看 97.2K关注 0票数 15

我正在尝试使用axis-java2wsdl ant任务从我的一个java类创建wsdl,但我无法正确获取类路径。

我使用的是Ubuntu的libaxis-java包,它将axis-ant.jar安装在$ANT_HOME/lib中,将axis.jar安装在/usr/share/java中。我的build.xml的有趣部分如下所示:

代码语言:javascript
运行
复制
<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会导致:

代码语言:javascript
运行
复制
/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:

代码语言:javascript
运行
复制
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定义这些库,我会非常感激

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-27 06:58:14

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

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

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

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

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

注:运行ant -diagnostics can help too

票数 16
EN

Stack Overflow用户

发布于 2009-01-27 05:05:36

用于添加库的Ant mechanism为:

通过命令行参数

  • -lib
  • 添加到${user.home}/.ant/lib
  • adding to ${ant.home}/lib

只有这样。manual没有提到任何关于使用system.library.dir属性的内容。可能出于这个目的,它几乎被忽略了。

此外,在详细模式下运行ant (和-verbose )以查看幕后执行的操作。

票数 5
EN

Stack Overflow用户

发布于 2009-01-27 17:12:37

为什么不采用最简单的选项并在<taskdef>中指定类路径

代码语言:javascript
运行
复制
<taskdef resource="axis-tasks.properties">
    <classpath>
        <fileset file="/path/to/axis/jars"/>
    </classpath>
</taskdef>

或者创建第二个子集library.dir<classpath>条目

代码语言:javascript
运行
复制
<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/482303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档