[英]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
這些罐子都可以很好地加載到類路徑$ {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.