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

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

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

             details omitted   

运行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中无法定义这些库的错误,我仍然非常感激

一般来说,这是有效的。 但是你需要仔细检查哪些类在哪里。

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

阅读FAQ条目以获取更多详细信息。

Ant的类加载器实现使用Java的委托模型

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

注意:运行ant -diagnostics 也可以提供帮助 。

添加库的Ant 机制是:

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

只要。 本手册未提及有关使用system.library.dir属性的任何内容。 可能它为此目的几乎被忽略了。

此外,以详细模式运行ant(和-verbose)以查看引擎盖下的操作。

为什么不采用最简单的选项并在指定类路径?

      

或者创建第二个条目,用于子集library.dir

       

使用${ant.home}/lib并不是一个好主意,几乎总能避免。

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

  

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

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

这是ant build.xml:

                                    Dropping all database tables in ${sql.schema}...        

希望这可以帮助

当我将* .jar复制到{ant.home} / libs时我遇到了同样的问题,然后我用-lib来找到* .jar,它运行正常! 我认为这是新的jar子无法加载,然后我会测试它!