diff --git a/pom.xml b/pom.xml
index c6f648c..4cd0681 100755
--- a/pom.xml
+++ b/pom.xml
@@ -195,5 +195,12 @@
jar
test
+
+ org.codehaus.plexus
+ plexus-classworlds
+ 2.4
+ jar
+ test
+
diff --git a/src/main/java/org/xerial/snappy/LoadSnappy.java b/src/main/java/org/xerial/snappy/LoadSnappy.java
index aff7436..40ba313 100755
--- a/src/main/java/org/xerial/snappy/LoadSnappy.java
+++ b/src/main/java/org/xerial/snappy/LoadSnappy.java
@@ -48,8 +48,10 @@ public class LoadSnappy
private static boolean isLoaded = false;
public static boolean load() {
- if (!isLoaded)
+ if (!isLoaded) {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
loadSnappyNativeLibrary();
+ }
return isLoaded;
}
diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java
index 76f545d..6bbde4d 100755
--- a/src/main/java/org/xerial/snappy/Snappy.java
+++ b/src/main/java/org/xerial/snappy/Snappy.java
@@ -24,6 +24,9 @@
//--------------------------------------
package org.xerial.snappy;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.nio.ByteBuffer;
/**
@@ -35,6 +38,46 @@ import java.nio.ByteBuffer;
public class Snappy
{
+ static {
+ URL resource = Snappy.class.getResource("/org/xerial/snappy/SnappyNative.class");
+ // jar:file:/C:/.../snappy-java-1.0.1-rc4-SNAPSHOT.jar!/org/xerial/snappy/SnappyNative.class
+ if (resource == null) {
+ LoadSnappy.load();
+ }
+ else {
+ String path = resource.toString();
+ if (path.startsWith("jar:")) {
+ int pos = path.indexOf(".jar!");
+ if (pos >= 0) {
+ path = path.substring(4, pos + 4);
+ }
+ }
+ else {
+ path = path.replace("SnappyNative", "LoadSnappy");
+ }
+ try {
+ URL loaderPath = new URL(path);
+ ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
+ if (URLClassLoader.class.isInstance(systemClassLoader)) {
+
+ URLClassLoader cl = URLClassLoader.class.cast(systemClassLoader);
+ Method addURLmethod = URLClassLoader.class.getDeclaredMethod("addURL",
+ new Class< ? >[] { URL.class });
+ addURLmethod.setAccessible(true);
+
+ addURLmethod.invoke(cl, loaderPath);
+ Class< ? > snappyLoader = cl.loadClass("org.xerial.snappy.LoadSnappy");
+ Method loader = snappyLoader.getMethod("load");
+ loader.invoke(null);
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+ }
+
/**
* Get the native library version of the snappy
*
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.java b/src/main/java/org/xerial/snappy/SnappyNative.java
index 7b63851..7674e0c 100755
--- a/src/main/java/org/xerial/snappy/SnappyNative.java
+++ b/src/main/java/org/xerial/snappy/SnappyNative.java
@@ -34,9 +34,6 @@ import java.nio.ByteBuffer;
*/
public class SnappyNative
{
- static {
- LoadSnappy.load();
- }
public native static String nativeLibraryVersion();
diff --git a/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappy.dll b/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappy.dll
index aab93e0..2da27c9 100755
Binary files a/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappy.dll and b/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappy.dll differ
diff --git a/src/test/java/org/xerial/snappy/SnappyTest.java b/src/test/java/org/xerial/snappy/SnappyTest.java
index 6412275..0a7cb6c 100755
--- a/src/test/java/org/xerial/snappy/SnappyTest.java
+++ b/src/test/java/org/xerial/snappy/SnappyTest.java
@@ -210,7 +210,12 @@ public class SnappyTest
byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
byte[] uncompressed = Snappy.uncompress(compressed);
String result = new String(uncompressed, "UTF-8");
- System.out.println(result);
+ _logger.debug(result);
+
+ }
+
+ @Test
+ public void loadByDifferentClassLoader() throws Exception {
}