簡體   English   中英

運行Ant taskdef時有多個類路徑?

[英]Multiple classpaths when running Ant taskdef?

我有一個使用自定義類路徑調用Java 11類的ANT腳本

<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目錄包含幾個jar

  • A.jar-我的書架
  • B.jar-第三方庫
  • C.jar-第三方庫,與B.Jar不同

這些罐子都可以很好地加載到類路徑$ {ant.classpath}中。

工作流程如下:A.jar調用B.jar,而B.jar調用C.jar。

因此,A.jar調用B.jar中的類沒有問題。 它使用JAVA中的import語句來調用類:

import B.SomeClass;

這很完美。

但是,B.jar調用C.jar並失敗。

我能夠檢查兩個第三方庫的源代碼,並了解到B.jar使用Java的Classloader類從C.jar調用了類。 它不使用導入語句。

下面是來自B.jar內部類的代碼

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
....
classLoader.loadClass("C.SomeClass");

我得到的例外是:

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.jar中確實存在C.SomeClass。

我懷疑它加載的類路徑與ant taskdef提供的類路徑不同。 當我嘗試使用ClassLoader從我的庫(A.jar)中加載C.jar類時,出現了相同的異常。 但是導入效果很好。

我有點無所適從,因為我無法讓B.jar通過Ant正確加載C.jar。

編輯:

如果有用,我使用的是Java 11,B.jar實際上是jaxb-api-2.4.0.jar(javax.xml.bind),而C.jar是jaxb-runtime-2.4.0.jar(com .sun.xml.bind)及其依賴項(jaxb-core,stax-ex,txw2等)。 調用時,我收到ClassNotFoundException:

JAXBContext jc = JAXBContext.newInstance(Feature.class);

而且它找不到com.sun.xml.bind.v2.ContextFactory類,我已經證實它確實存在。

因此,我在A.jar中弄亂了,並了解到getClass()。getClassLoader()和Thread.currentThread()。getContextClassLoader()返回不同的東西。 getClass()。getClassLoader()包含我在ANT腳本中設置的ANT類路徑,而Thread類加載器則沒有。

由於它是第三方庫,因此無法更改B.jar中的代碼,但是,我可以使用以下代碼在我的代碼中設置線程的類加載器:

ClassLoader cl = this.getClass().getClassLoader();
Thread.currentThread().setContextClassLoader(cl);

我在代碼調用B.jar和隨后的C.jar之前將其放入代碼中。 效果很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM