ant taskdef - java.lang.UnsatisfiedLinkError:JSTAF(库已经加载到另一个ClassLoader中)

时间:2011-03-25 12:49:31

标签: ant

我编写了两个不同的任务,需要加载相同的库,其中包含一些在这些任务中导入的类:

<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)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是一个本地库吗?

如果不是,请发布确切的堆栈跟踪和有关任务的信息。因为你不应该从正常的JAR中获得这个错误。

如果是,那么您将遇到Java的“沙盒”设计的一个后果:底层操作系统通常只允许加载一次共享库。不同的类加载器,因为它们可能代表不同应用程序之间的隔离点,不允许共享本机库(因为这可以打开对跨应用程序攻击的访问)。

Ant使这更糟糕,因为它为每个taskdef使用一个单独的类加载器(参见this blog post)。我认为,如该博客所述,最佳解决方案是创建一个结合了所有任务的antlib规范。