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

2022-09-03 13:19:05

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

我正在使用Ubuntu的libaxis-java包,它将axis-ant.jar安装在$ANT_HOME/lib中,axis.jar安装在/usr/share/java中。我的构建.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位于“库”定义的路径上。

我知道这是一个类路径问题,因为我能够通过DefaultAuthenticator到符号链接轴找不到的其他类.jar到$ANT_HOME/lib。如何让 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

如果有人能告诉我,在构建中无法定义这些库时,我做错了什么,我仍然会非常感激.xml


答案 1

通常,这有效。但是你需要非常仔细地检查哪些类在哪里。

如果你的任务类可以装入类装入器层次结构中更高级别的类装入器(如CLASSPATH或ANT_HOME/lib),那么你的classpathref将被忽略

有关更多详细信息,请阅读常见问题解答条目

Ant 的类装入器实现使用 Java 的委托模型

类使用委派模型来搜索类和资源。类装入器的每个实例都有一个关联的父类装入器。当被要求查找类或资源时,ClassLoader 实例会先将类或资源的搜索委托给其父类装入器,然后再尝试查找类或资源本身。虚拟机的内置类装入器(称为引导类装入器)本身没有父级,但可以用作类装入器实例的父级。

注意:跑步也会有所帮助ant -diagnostics


答案 2

用于添加库的 Ant 机制是:

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

只。该手册没有提到任何有关使用 system.library.dir 属性的信息。可能为此目的几乎忽略了它。

另外,在详细模式(和-详细)下运行蚂蚁,看看引擎盖下在做什么。


推荐