2011-03-25 58 views
0

我寫這需要加載同一個庫,其中包含一些類,在這些任務導入兩個不同的任務:螞蟻的taskdef - java.lang.UnsatisfiedLinkError中:JSTAF(庫已裝入另一個類加載器)

<taskdef name="someTask1" classname="somepackage.someTask1" classpath="Tasks1.jar;/pathtolib/MyJar.jar" /> 
<taskdef name="someTask2" classname="somepackage.someTask2" classpath="Task2s.jar;/pathtojar/MyJar.jar"/> 

因爲我不能加載相同的庫兩次,我得到以下錯誤:

21: java.lang.UnsatisfiedLinkError: MyJar (Library is already loaded in another ClassLoader) 

我怎樣才能解決這個問題?

回答

0

這是一個本地庫嗎?

如果不是,請發佈確切的堆棧跟蹤和任務信息。因爲你不應該從普通的JAR中獲取這個錯誤。

如果是的話,那麼你就會遇到Java的「沙箱」設計的一個後果:底層操作系統通常只允許一次加載共享庫。而不同的類加載器,因爲它們可能代表不同應用程序之間的隔離點,所以不允許共享本地庫(因爲這可能會導致跨應用程序攻擊)。

Ant使這一點變得更糟,因爲它爲每個taskdef使用一個單獨的類加載器(請參閱this blog post)。我認爲如該博客中所述的最佳解決方案是創建一個結合了所有任務的規範antlib

+0

它不是本地庫,它是JSTAF庫,用於訪問staf http://staf.sourceforge.net/。這兩個任務都使用這個庫,所以我可以在java中使用staf命令。 C:\ Datastore \ BuildTest \ build.xml:15:執行此行時發生以下錯誤: C:\ Datastore \ BuildTest \ build.xml:24:java.lang.UnsatisfiedLinkError:JSTAF(庫已加載另一個類加載器) – raphael 2011-03-25 13:38:58

+0

@raphael - 當我查看JSTAF源代碼樹時,我看到了.cpp文件,它告訴我有一個本地庫。無論如何,如果你按照這個答案的指示,它應該適合你。 – TempUser 2011-03-25 13:51:33

+0

好像我錯過了那個。非常感謝你的回答,你幫了很多:) – raphael 2011-03-25 14:02:09

相關問題