当前位置: 首页 > 面试题库 >

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

柳镜
2023-03-14
问题内容

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

我正在使用Ubuntu的libaxis-java软件包,该软件包将$ ant_HOME / lib中的axis-ant.jar和/ usr / share
/ java中的axis.jar安装。我的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/DefaultAuthenticator

Ant可以找到axis-java2wsdl任务的定义,因为axis-ant.jar位于$ ANT_HOME /
lib中,但即使jar位于“库”定义的路径上,也无法在axis.jar中找到类。

我知道这是一个类路径问题,因为通过将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 也有帮助。



 类似资料:
  • 在我将Android Studio更新到2.3版本后,当我做我的项目时,我得到了这个错误 /users/xxx/work/yyy/build.xml:96:taskdef类com.android.ant.getuitargetTask无法找到类所需的类:com/android/utils/ilogger使用classloader Antclassloader[/users/xxx/library/

  • 我一直在学习如何使用spring数据,并创建了一个非常简单的项目来测试它。文件夹结构和applicationcontext。xml显示在这里:applicationcontext。xml和文件夹结构我得到的错误显示在这里:控制台错误输出。我在类路径上有applicationContext,并声明了该类的bean,你知道我的问题是什么吗?非常感谢。 编辑:我已经更新了我的帖子,以显示主类和道类,以及

  • 我有一个带有两个外部库的Java项目。在Eclipse中一切都运行良好,当导出为可运行的JAR时没有错误。但是,当我使用会抛出臭名昭著的。 我尝试使用所有三个导出选项(提取、包、复制),但没有成功。 (使用eclipse)

  • 外部定义 有时候创建一个由多个不同检出得到的工作拷贝是非常有用的,举个例子,你或许希望不同的子目录来自不同的版本库位置,或者是不同的版本库。你可以手工设置这样一个工作拷贝—使用svn checkout来创建这种你需要的嵌套的工作拷贝结构。但是如果这个结构对所有的用户是很重要的,每个用户需要执行同样的检出操作。 很幸运,Subversion提供了外部定义的支持,一个外部定义是一个本地路经到URL的影

  • 在中定义额外的方法(不重写超类方法)时,代码编译良好,没有任何问题,但如果我试图调用额外的方法,它会抛出错误。那么,在使用扩展时,是否只有在子类中的方法才可能?如果是这样,谁能解释一下为什么? 下面是我的代码的样子 这就是我得到的错误