From 9f71f8eb1cbd812ca9f2484619f63ec9cf2aafcf Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Wed, 6 Apr 2011 12:05:55 +0900 Subject: [PATCH] An attempt to use system class loader when loading dll --- pom.xml | 7 +++ .../java/org/xerial/snappy/LoadSnappy.java | 4 +- src/main/java/org/xerial/snappy/Snappy.java | 43 ++++++++++++++++++ .../java/org/xerial/snappy/SnappyNative.java | 3 -- .../snappy/native/Windows/amd64/snappy.dll | Bin 644608 -> 644608 bytes .../java/org/xerial/snappy/SnappyTest.java | 7 ++- 6 files changed, 59 insertions(+), 5 deletions(-) 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 aab93e0db43f58bd725bd7de4d749a8432e5598e..2da27c97e94fd74aaf62c201c10d46aceab8e9a8 100755 GIT binary patch delta 60 zcmV-C0K@-)tS5l1CylzZ=j1 delta 60 zcmV-C0K@-)tS5l1Cy