首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行Ant taskdef时有多个类路径?

运行Ant taskdef时有多个类路径?
EN

Stack Overflow用户
提问于 2018-12-10 19:32:27
回答 1查看 610关注 0票数 0

我有一个ANT脚本,它使用自定义类路径调用Java 11类

代码语言:javascript
复制
<path id="ant.classpath">
        <fileset dir="${basedir}/lib/ant">
            <include name="*.jar" />
        </fileset>
</path>

<taskdef name="myTaskDef" classname="A.SomeClass" classpathref="ant.classpath" />

${basedir}/lib/ant目录包含几个jars

  • A.jar -我的图书馆
  • B.jar -第三方图书馆
  • C.jar -第三方图书馆,与B.Jar不同的公司

这些jars都加载到类路径${ant.classpath}中,非常好。

工作流程如下所示: A.jar调用B.jar,B.jar调用C.jar。

因此,A.jar在B.jar中调用类没有问题。它使用JAVA中的import语句调用类:

代码语言:javascript
复制
import B.SomeClass;

这工作得很好。

然而,B.jar调用C.jar却失败了。

我能够检查两个第三方库的源代码,并了解到B.jar使用类从C.jar调用类。它不使用import语句。

下面是B.jar内部一个类的代码

代码语言:javascript
复制
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
....
classLoader.loadClass("C.SomeClass");

我得到的例外是:

代码语言:javascript
复制
java.lang.ClassNotFoundException: C.SomeClass
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at B.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)

我能够验证C.SomeClass确实存在于C.jar中。

我怀疑它装载的类路径与ant提供的类路径不同。当我试图使用C.jar从我的库(A.jar)中加载ClassLoader类时,我会得到相同的异常。但进口产品运作得很好。

我有点不知所措,因为我无法让B.jar通过Ant正确地加载C.jar。

编辑:

如果有用的话,我使用的是Java 11,B.jar实际上是jaxb-api-2.4.0.jar (javax.xml.bind),C.jar是jaxb-运行时-2.4.0.jar (com.sun.xml.bind)加上它的依赖项(jaxb-core、stax-ex、txw2等等)。当我打电话时,我得到了ClassNotFoundException:

代码语言:javascript
复制
JAXBContext jc = JAXBContext.newInstance(Feature.class);

它找不到com.sun.xml.bind.v2.ContextFactory类,我已经确认它确实存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-11 15:30:25

因此,我在A.jar中乱搞了一番,并了解到getClass()、.getClassLoader()和getClass返回不同的东西。getClass().getClassLoader()包含我在ANT脚本中设置的ANT类路径,线程类加载器没有。

我无法更改B.jar中的代码,因为它是一个第三方库,但是,我可以使用以下方法在代码中设置线程的类加载器:

代码语言:javascript
复制
ClassLoader cl = this.getClass().getClassLoader();
Thread.currentThread().setContextClassLoader(cl);

我在代码调用B.jar之前将其放入代码中,随后调用了C.jar。它工作得很好!

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

https://stackoverflow.com/questions/53712395

复制
相关文章

相似问题

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