我有两个java Web服务,每个都创建一个相同静态类的实例(使用下面显示的lazy实例化的单例),使用System.LoadLibrary()加载几个dll。在运行时,实例化该类的第一个Web服务能够成功加载库。第一个服务激活第二个服务。当第二个Web服务尝试实例化同一个类时,它会获得异常" java.lang.UnsatisfiedLinkError:Native Library xxx.dll已经加载到另一个类加载器中#34;。当我在Eclipse中调试第二个类实例化时,我检查应该保存第一个实例的私有类实例成员。调试器指示它不为null,因此它应该返回并跳过延迟实例化。但是,(_instance!= null)的测试失败,它再次实例化该类,从而导致错误。
private static volatile SimServiceBone _instance;
public static SimServiceBone getInstance(String[] args, boolean fileBasedTasks) {
if (_instance != null) {
return _instance;
}
synchronized (SimServiceBone.class) {
if (_instance == null) {
_instance = new SimServiceBone(args, fileBasedTasks);
}
}
return _instance;
}
private SimServiceBone(String[] args, boolean fileBasedTasks) {
super("SimfiniBone", fileBasedTasks, args);
initService(R().getString("Monitor_bone"), args); // LOADS DLLS
}
我已经阅读了很多关于这种情况的文章,他们都谈到将共享类的jar文件的副本放入Tomcat安装的sharedlibs文件夹中。但是,我还没有将应用程序部署到Tomcat。我仍在使用Eclipse中的Tomcat集成进行开发和调试。
包含两个Web服务共享的类的项目在两个Web服务中都列为Web部署程序集。
Eclipse中是否有一些设置指示要在两个Web服务之间共享一个特定的类,以便只加载一次库,或者我应该做些什么来避免这种冲突?