@ -26,6 +26,7 @@ public class LibraryLoadProviderManager {
private static final String SRC_PATH_PREFIX = "" ;
private static final String DES_CLASS_PREFIX = "/sun/tools/attach" ;
private static final String CLASS_PACKAGE_NAME = "sun.tools.attach" ;
private static final String DES_LIBRARY_PREFIX = "/library" ;
private static final String FANRUAN_VM_TMPDIR_PROP = "fanruan.vm.tmpdir" ;
@ -62,7 +63,7 @@ public class LibraryLoadProviderManager {
if ( classLoader = = null ) {
String classpath = getTempToolsDirPath ( ) ;
File file = new File ( classpath ) ;
classLoader = new URLClassLoader ( new URL [ ] { file . toURI ( ) . toURL ( ) } , this . getClass ( ) . getClassLoader ( ) ) ;
classLoader = new Custom URLClassLoader( new URL [ ] { file . toURI ( ) . toURL ( ) } , this . getClass ( ) . getClassLoader ( ) ) ;
}
}
return classLoader ;
@ -77,7 +78,7 @@ public class LibraryLoadProviderManager {
FineLoggerFactory . getLogger ( ) . info ( "[CustomVM] get loading library path..." ) ;
String libName = libraryLoadProvider . libraryResource ( ) ;
String normalizePath = FilenameUtils . normalize ( String . join ( "/" , getTempToolsDirPath ( ) , DES_LIBRARY_PREFIX , libName ) ) ;
FineLoggerFactory . getLogger ( ) . info ( "[CustomVM] loading library path:{}" + normalizePath ) ;
FineLoggerFactory . getLogger ( ) . info ( "[CustomVM] loading library path:{}" , normalizePath ) ;
return normalizePath ;
} catch ( IOException e ) {
FineLoggerFactory . getLogger ( ) . error ( e , e . getMessage ( ) ) ;
@ -226,4 +227,24 @@ public class LibraryLoadProviderManager {
FineLoggerFactory . getLogger ( ) . error ( e . getMessage ( ) ) ;
}
}
private class CustomURLClassLoader extends URLClassLoader {
CustomURLClassLoader ( URL [ ] urls , ClassLoader parent ) {
super ( urls , parent ) ;
}
@Override
public Class < ? > loadClass ( String className ) throws ClassNotFoundException {
if ( className . startsWith ( CLASS_PACKAGE_NAME ) ) {
//有tools.jar但是不存在attach的情况下,sun.tools.attach.* 这些类要打破双亲委派机制直接加载自定义的
Class < ? > loadedClass = findLoadedClass ( className ) ;
if ( loadedClass = = null ) {
FineLoggerFactory . getLogger ( ) . info ( "{} load from custom urls directly" , className ) ;
return findClass ( className ) ;
}
}
return super . loadClass ( className ) ;
}
}
}