我正在尝试使用axis-java2wsdl ant任务从我的一个java类创建wsdl,但我无法正确获取类路径。
我使用的是Ubuntu的libaxis-java包,它将axis-ant.jar安装在$ANT_HOME/lib中,将axis.jar安装在/usr/share/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/DefaultAuthenticatorAnt能够找到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定义这些库,我会非常感激
发布于 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。
发布于 2009-01-27 05:05:36
用于添加库的Ant mechanism为:
通过命令行参数
只有这样。manual没有提到任何关于使用system.library.dir属性的内容。可能出于这个目的,它几乎被忽略了。
此外,在详细模式下运行ant (和-verbose )以查看幕后执行的操作。
发布于 2009-01-27 17:12:37
为什么不采用最简单的选项并在<taskdef>中指定类路径
<taskdef resource="axis-tasks.properties">
<classpath>
<fileset file="/path/to/axis/jars"/>
</classpath>
</taskdef>或者创建第二个子集library.dir的<classpath>条目
<path id="axis-tools-classpath">
<fileset dir="/path/to/axis/home">
<include name="*.jar"/>
</fileset>
<path refid="library.dir"/>
</path>摆弄${ant.home}/lib不是一个好主意,几乎总是可以避免的。
https://stackoverflow.com/questions/482303
复制相似问题