我编写了两个不同的任务,需要加载相同的库,其中包含一些在这些任务中导入的类:
<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 :(得分:0)
这是一个本地库吗?
如果不是,请发布确切的堆栈跟踪和有关任务的信息。因为你不应该从正常的JAR中获得这个错误。
如果是,那么您将遇到Java的“沙盒”设计的一个后果:底层操作系统通常只允许加载一次共享库。不同的类加载器,因为它们可能代表不同应用程序之间的隔离点,不允许共享本机库(因为这可以打开对跨应用程序攻击的访问)。
Ant使这更糟糕,因为它为每个taskdef使用一个单独的类加载器(参见this blog post)。我认为,如该博客所述,最佳解决方案是创建一个结合了所有任务的antlib规范。