Error: java.lang.UnsatisfiedLinkError: Native Library jsg83.dll already loaded in another classloader
When using the ArcSDE Java API in an environment with multiple classloaders; for example servlet container, the following error occurs:
"java.lang.UnsatisfiedLinkError: Native Library jsg83.dll already loaded in another classloader"
The error may be returned in a Web client or a log file associated with the container; for example, Tomcat or ServletExec.
The ArcSDE Java API uses Java classes in the jsde83_sdk.jar that call the native library, jsg83.dll or .so on Unix platforms, in the $SDEHOME/bin directory. Due to a limitation of the JVM classloader, these Java classes should only be loaded once per process. See the Related Information article below for additional information on this issue.
Solution or Workaround
With a servlet or EJB container, often managed by an application server, classes or jars can be placed in a location that loads them only once, accessible by any Web application managed by the container process. As an example, using Tomcat add the jsde83_sdk.jar to a pre-defined repository for jars; for example, /usr/tomcat/lib that makes them available to the container process as a whole - and by default exposed to a single classloader.
For ServletExec AS, add the jsde83_sdk.jar to the pre-defined repository; for example, C:\Program Files\New Atlanta\ServletExec AS\lib and add a reference to it in the StartServletExec.bat file. The path to the jsg*.dll, pe*.dll, sdejavautil.dll, and sg*.dll libraries, usually in the $SDEHOME/bin directory, must also be added to the PATH for the environment in which the servlet container is running. On a Unix platform the shared libraries are libjsg*.so, pe*.so, libsdejavautil.so, and sg*.so. The '*' represents the version of the ArcSDE client libraries.