Skip to content

Commit f7be737

Browse files
committed
Try to set system class loader -- not successful
1 parent fdf05ea commit f7be737

File tree

2 files changed

+75
-4
lines changed

2 files changed

+75
-4
lines changed

scyjava/__init__.py

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
import os
2+
import pathlib
3+
import subprocess
4+
import tempfile
5+
tmp_dir = tempfile.mkdtemp()
6+
7+
import jnius_config
8+
jnius_config.add_classpath(tmp_dir)
9+
110
def _get_logger(name):
211
import logging
312
return logging.getLogger(name)
@@ -42,6 +51,54 @@ def _init_jvm():
4251
_GrapeIvy = _autoclass('groovy.grape.GrapeIvy')
4352
_grapeIvy = _GrapeIvy()
4453
_classLoader = _autoclass('groovy.lang.GroovyClassLoader')()
54+
_Thread = _autoclass('java.lang.Thread')
55+
_ClassLoader = _autoclass('java.lang.ClassLoader')
56+
get_class_loader_code="""
57+
import java.lang.Class;
58+
import java.lang.ClassLoader;
59+
import java.lang.reflect.Field;
60+
61+
public class GetClassLoaderClass
62+
{
63+
public static Class<ClassLoader> getClassLoaderClass()
64+
{
65+
return ClassLoader.class;
66+
}
67+
68+
public static void setSystemClassLoader( ClassLoader classLoader ) throws IllegalAccessException, NoSuchFieldException
69+
{
70+
Field scl = getClassLoaderClass().getDeclaredField( "scl" );
71+
scl.setAccessible( true );
72+
scl.set( null, classLoader );
73+
}
74+
}
75+
"""
76+
fp = pathlib.Path( tmp_dir ) / 'GetClassLoaderClass.java'
77+
print( tmp_dir )
78+
with open( fp, 'w' ) as f:
79+
f.write( get_class_loader_code )
80+
81+
82+
javac = pathlib.Path( os.environ[ 'JAVA_HOME' ] ) / 'bin' / 'javac'
83+
proc = subprocess.run(
84+
[ javac, '-cp', jnius_config.split_char.join( jnius_config.get_classpath() ), fp ],
85+
stdout=subprocess.PIPE,
86+
stderr=subprocess.PIPE)
87+
if proc.returncode != 0:
88+
print("Failed!")
89+
print ( proc.stderr )
90+
91+
_GetClassLoaderClass = _autoclass('GetClassLoaderClass')
92+
_GetClassLoaderClass.setSystemClassLoader( _classLoader );
93+
print("System classloader", _ClassLoader.getSystemClassLoader().getClass().getName())
94+
95+
# try:
96+
# _scl = _GetClassLoaderClass.getClassLoaderClass().getDeclaredField('scl')
97+
# print(_scl)
98+
# _scl.setAccessible(True)
99+
# _scl.set(None, _classLoader)
100+
# except JavaException as e:
101+
# print(e)
45102

46103
def _default_map(**extra_options):
47104
m = _HashMap()
@@ -68,12 +125,22 @@ def dependency(groupId, artifactId, version=None, **grape_options):
68125
return _grapeIvy.grab(m)
69126

70127
def import_class(clazz):
71-
loaded_class = _classLoader.loadClass(clazz)
128+
try:
129+
print("SETTING CLASSLOADER", _classLoader)
130+
# _Thread.currentThread().setContextClassLoader(_cast('java.lang.ClassLoader',_classLoader))
131+
_Thread.currentThread().setContextClassLoader(_classLoader)
132+
except JavaException as e:
133+
print( "e.classname -- {}".format( e.classname ) )
134+
print( "e.innermessage -- {}".format( e.innermessage ) )
135+
# for st in e.stacktrace:
136+
# print( st )
137+
# loaded_class = _classLoader.loadClass(clazz)
72138
# clz = Class(noinstance=True)
73139
# clz.instanciate_from(create_local_ref(j_env, jc))
74-
# return _autoclass(clazz)
75-
print( "CONSTRS ", loaded_class)
76-
return _wrap_java_class(clazz, loaded_class)
140+
print("classloader", _Thread.currentThread().getContextClassLoader().getClass().getName())
141+
return _autoclass(clazz)
142+
# print( "CONSTRS ", loaded_class)
143+
# return _wrap_java_class(clazz, loaded_class)
77144

78145
def list_grapes():
79146
grapes = _grapeIvy.enumerateGrapes()

test_scyjava.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import jnius_config
2+
jnius_config.add_classpath('/home/phil/git/scyjava2/groovy-3.0.0-alpha-2.jar')
3+
jnius_config.add_classpath('/home/phil/git/scyjava2/ivy-2.5.0-rc1.jar')
4+
15
import scyjava
26
from jnius.reflect import Modifier
37
print(Modifier)

0 commit comments

Comments
 (0)