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 { }